atlus/frontend/css/apps/display.css
roberts a73b515258 Add native GUI app support via per-window frame streaming
Each configured GUI app (e.g. Nextcloud) gets its own dock icon and
opens as a regular Atlus tab. Under the hood: Xvfb virtual display,
ImageMagick captures individual window pixmaps as JPEG, streams over
WebSocket to a canvas element, with xdotool forwarding mouse/keyboard
input back to the X11 window. Apps persist in background when tab is
closed, and streaming pauses when no viewers are attached.

New files: backend/display.py (DisplayManager + ManagedGuiApp),
backend/routers/display.py (WebSocket + REST), frontend display.js/css.
Config: gui_apps array in settings for registered applications.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 23:09:15 -05:00

74 lines
1.4 KiB
CSS

/* GUI App display — canvas-based window rendering */
.app-gui-display {
display: flex;
flex-direction: column;
height: 100%;
background: #0a0a0a;
}
.gui-canvas-wrap {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
position: relative;
}
.gui-canvas {
max-width: 100%;
max-height: 100%;
cursor: default;
outline: none;
image-rendering: auto;
}
/* Status overlays */
.gui-status {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
font-family: var(--font-mono);
font-size: 13px;
color: var(--text-muted);
background: var(--bg-stage);
}
.gui-status-icon {
font-size: 32px;
opacity: 0.5;
}
.gui-status-text {
text-align: center;
line-height: 1.6;
}
.gui-status.connecting .gui-status-icon::after {
content: '';
display: inline-block;
width: 16px;
height: 16px;
border: 2px solid var(--text-muted);
border-top-color: var(--accent);
border-radius: 50%;
animation: gui-spin 0.8s linear infinite;
margin-left: 8px;
vertical-align: middle;
}
@keyframes gui-spin {
to { transform: rotate(360deg); }
}
.gui-status.exited {
color: var(--status-red);
}
.gui-status.exited .gui-status-icon {
opacity: 0.7;
}