1Arcan
2=====
3
4Arcan is a powerful development framework for creating virtually anything from
5user interfaces for specialized embedded applications all the way to full-blown
6standalone desktop environments.
7
8At its heart lies a robust and portable multimedia engine, with a well-tested
9and well-documented Lua scripting interface. The development emphasizes
10security, debuggability and performance -- guided by a principle of least
11surprise in terms of API design.
12
13For more details about capabilities, design, goals, current development,
14roadmap, changelogs, notes on contributing and so on, please refer to the
15[arcan-wiki](https://github.com/letoram/arcan/wiki).
16
17There is also a [website](https://arcan-fe.com) that collects other links,
18announcements, releases, videos / presentations and so on.
19
20* For community contact, check out the IRC channel #arcan on irc.libera.chat
21  and/or the [discord (invite-link)](https://discord.com/invite/sdNzrgXMn7)
22
23* For developer information, see the HACKING.md
24
25Getting Started
26====
27
28Some distributions, e.g. [voidlinux](https://voidlinux.org) have most of arcan
29as part of its packages, so you can save yourself some work going for one of
30those.
31
32Docker- container templates (mainly used for headless development and testing)
33can be found here, quality varies wildly from bad to poor (just like Docker):
34[dockerfiles](https://github.com/letoram/arcan-docker).
35
36## Compiling from Source
37
38There are many ways to tune the build steps in order to reduce dependencies.
39There are even more ways to configure and integrate the components depending
40on what you are going for; running as a native desktop or as an application
41runtime inside another desktop?
42
43Most options are exposed via the build output from running cmake on the src
44directory.
45
46For the sake of simplicity over size, there is a build preset, 'everything'
47which is the one we will use here.
48
49### Dependencies
50
51Specific package names depend on your distribution, but common ones are:
52
53    sqlite3, openal-soft, sdl2, opengl, luajit, gbm, kms, freetype, harfbuzz
54    libxkbcommon
55
56For encoding and decoding options you would also want:
57
58    libvlc-core (videolan), the ffmpeg suite, leptonica, tesseract
59    libvncserver libusb1
60
61First we need some in-source dependencies that are cloned manually for now:
62
63    git clone https://github.com/letoram/arcan.git
64    cd arcan/external/git
65    ./clone.sh
66    cd ../../
67
68These are typically not needed, the main use is for ensuring certain build
69options that might vary between distributions (freetype/luajit) and to ensure
70that a recoverable desktop can be statically linked and executed in an
71otherwise broken userspace (so embedded bringup). The one exception is OpenAL
72which is patched to be used by a special (arcan-lwa) build. This is slated for
73refactoring to remove that dependency, but there are other priorities in the
74way.
75
76### Compiling
77
78Now we can configure and build the main engine:
79
80    mkdir build
81    cd build
82    cmake -DBUILD_PRESET="everything" ../src
83
84Like with other CMake based projects, you can add:
85
86    -DCMAKE_BUILD_TYPE=Debug
87
88To switch from a release build to a debug one.
89
90When it has finished probing dependencies, you will get a report of which
91dependencies that has been found and which features that were turned on/off,
92or alert you if some of the required dependencies could not be found.
93
94Make and install like normal (i.e. make, sudo make install). A number of
95binaries are produced, with the 'main' one being called simply arcan. To
96test 'in source' (without installing) you should be able to run:
97
98     ./arcan -T ../data/scripts -p ../data/resources ../data/appl/welcome
99
100The -T argument sets our built-in/shared set of scripts, the -p where shared
101resources like fonts and so on can be found, and the last argument being
102the actual 'script' to run.
103
104With installation, this should reduce to:
105
106     arcan welcome
107
108It will automatically try to figure out if it should be a native display
109server or run nested within another or even itself based on the presence
110of various environment variables (DISPLAY, WAYLAND\_DISPLAY, ARCAN\_CONNPATH).
111
112'welcome' is a name of a simple builtin welcome screen, *that will shut down
113automatically after a few seconds of use*.
114
115For something of more directly useful, you can try the builtin appl 'console':
116
117    arcan console
118
119Which should work just like your normal console command-line, but with the
120added twist of being able to run (arcan compatible) graphical applications
121as well. For other projects, see the 'Related Projects' further below.
122
123If input devices are misbehaving, the quick and dirty 'eventtest' in:
124
125    arcan /path/to/arcan/tests/interactive/eventtest
126
127Might be useful in figuring out who to blame.
128
129### SUID Notes
130
131The produced egl-dri platform 'arcan' binary installs suid by default. This is
132not strictly necessary unless some specific features are desired, e.g. laptop
133backlight controls on Linux as those require access to sysfs and friends.
134
135Do note that your current user then still requires access to relevant
136/dev/input/event and /dev/dri/cardN and /dev/dri/renderN files to work properly
137otherwise input and/or graphics devices might not be detected or useable.
138
139The binary does split off into a non-suid part that the main engine runs off
140of, see posix/psep\_open.c for auditing what is being run with higher
141privileges as well as the code for dropping privileges. The privileged process
142is responsible for negotiating device access, implementing virtual-terminal
143switching and as a watchdog for recovering the main process on live locks or
144some GPU failures.
145
146### Hook-Scripts
147
148Another way to extend engine behavior regardless of the appl being used are
149so called hook-scripts. These reside inside the 'system script path' covered
150by the -T command-line argument, or the default of shared/arcan/scripts.
151
152The idea is that these should be able to provide 'toggle on' features that
153would need cooperation from within the engine, in order to do quick custom
154modifications or help bridge other tools.
155
156A good example is 'external\_input':
157
158    arcan -H hooks/external_input.lua -H hooks/external_input.lua myappl
159
160This would open up two connection points, 'extio\_1', 'extio\_2' that will
161allow one client to connect and provide input that will appear to the 'myappl'
162appl as coming from the engine.
163
164These are covered in more detail in the manpage.
165
166### Networking
167
168Arcan-net is a binary that allows you to forward one or many arcan clients
169over a network. It is built by default, and can be triggered both as a
170separate network tool as well as being launched indirectly from shmif by
171setting ARCAN\_CONNPATH=a12://id@host:port, or when issuing a migration
172request by the window manager.
173
174See also: src/a12/net/README.md and src/a12/net/HACKING.md.
175
176### Wayland
177
178The 'arcan-wayland' or 'waybridge', as it is refered to in some places is
179binary adds support for wayland and X clients (via Xwayland). It can be run as
180either a global system service, e.g.
181
182    arcan-wayland -xwl
183
184Or on a case by case basis, like:
185
186    arcan-wayland -exec weston-terminal
187
188For a compliant wayland client, and:
189
190    arcan-wayland -exec-x11 xterm
191
192For an X client. The 'per case' basis is recommended as it is safer and more
193secure than letting multiple clients share the same bridge process, at a
194negilable cost. The downside is that some complex clients that rely on making
195multiple distinct wayland connections may fail to work properly. Firefox is a
196known offender.
197
198There is a number of tuning and troubleshooting options due to the complexity
199of using wayland, consult the manpage and the --help toggle.
200
201### Database
202
203All runtime configuration is consolidated into a database, either the default
204'arcan.sqlite' one or an explicitly set one (arcan -d mydb.sqlite).
205
206This is used for platform specific options, engine specific options and for
207trusted clients that the running scripts are allowed to start. It is also used
208as a configuration key-value store for any arcan applications that are running.
209
210As a quick example, this is how to inspect and modify keys that 'Durden'
211are currently using:
212
213    arcan_db show_appl durden
214    arcan_db add_appl_kv durden shadow_on true
215
216Advanced configuration for some video platforms can be set via the reserved
217arcan appl name. This would, for instance, set the primary graphics card
218device name for the 'egl-dri' platform version:
219
220    arcan_db add_appl_kv arcan video_device=/dev/dri/card2
221
222To add 'launch targets', you can use something like:
223
224    arcan_db add_target net BIN /usr/bin/arcan-net -l netfwd
225    arcan_db add_config arcan-net default 10.0.0.10 6666
226    arcan_db add_target xterm BIN /usr/bin/arcan-wayland -exec-x11
227
228This allow applications to start a program as a trusted child (that inherits
229its connection primitives rather than to try and find them using some OS
230dependent namespace). The example above would have spawned arcan-net in the
231local mode where clients connecting to the 'netfwd' connpath would be
232redirected to the server listening at 10.0.0.10:6666.
233
234There are many controls and options for this tool, so it is suggested that you
235look at its manpage for further detail and instructions.
236
237### Headless Mode
238
239The 'everything' build option should also produce a binary called
240'arcan\_headless', at least on BSDs and Linux. This binary can be used to run
241arcan without interfering with your other graphics and display system. Given
242access to a 'render node' (/dev/dri/renderD128 and so on) and it should also
243work fine inside containers and other strict sandboxing solutions.
244
245To make it useful, it can record/stream to a virtual screen. An example of
246such a setup following the example above would be:
247
248    ARCAN_VIDEO_ENCODE=protocol=vnc arcan_headless console
249
250Assuming the build-system found the libvncserver dependency, this should
251leave you with an exposed (insecure, unprotected, ...) vnc server at
252localhost+5900. See afsrv\_encode for a list of arguments that can be added
253to the encode environment in order to control what happens.
254
255Related Projects
256================
257
258If you are not interested in developing something of your own, you will
259likely find little use with the parts of this project alone. Here are some
260projects that you might want to look into:
261
262* [Durden](https://github.com/letoram/durden) is the main desktop
263  environment that uses this project as its display server.
264
265* [Safespaces](https://github.com/letoram/safespaces) is an experimental
266  VR/3D desktop environment.
267
268* [Pipeworld](https://github.com/letoram/pipeworld) is a dataflow
269  (think excel) programming environment
270
271* [Arcan-Devices](https://github.com/letoram/arcan-devices) accumulates
272  extra drivers.
273
274To get support for more types of clients and so on, there is also:
275
276* Wayland support (see Wayland section above, and src/wayland/README.md).
277
278* [QEmu](https://github.com/letoram/qemu) a patched QEmu version that
279  adds a -ui arcan option.
280
281* [Xarcan](https://github.com/letoram/xarcan) is a patched Xorg that
282  allows you to run an X session 'as a window'.
283
284* [nvim-arcan](https://github.com/letoram/nvim-arcan) is a neovim frontend
285  that act as a native arcan client.
286
287Tools
288=====
289
290There is also a number of helper tools that can be used to add certain
291features, such as support for VR devices and tray-icons. These are built
292separately and can be found in the tools/ subdirectory. They have their
293own separate build systems and corresponding README.md files.
294
295They work on the assumption that arcan and its respective libraries have been
296built and installed. They are lockstepped and versioned to the engine, so if
297you upgrade it, make sure to rebuild the tools as well.
298
299The main tools of interest are:
300
301## Acfgfs
302
303Acfgfs is a tool that lets you mount certain arcan applications as a FUSE
304file-system. The application has to explicitly support it. For the Durden
305desktop environment, you can use global/settings/system/control=somename
306and then:
307
308    arcan_cfgfs --control=/path/to/durden/ipc/somename /mnt/desktop
309
310And desktop control / configuration should be exposed in the specified
311mountpoint.
312
313## Aclip
314
315Aclip is a clipboard manager similar to Xclip. It allows for bridging the
316clipboard between a desktop environment like Durden, and that of an X server.
317
318This requires that clipboard bridging has been allowed (disabled by default for
319security reasons). In Durden this is activated via
320global/settings/system/clipboard where you can control how much clipboard
321access the tool gets.
322
323## Aloadimage
324
325Aloadimage is a simple sandboxing image loader, similar to xloadimage. It is
326useful both for testing client behavior when developing applications using
327arcan, but also as an image viewer in its own right, with reasonably fast image
328loading, basic playlist controls and so on.
329
330## Vrbridge
331
332VR bridge is an optional input driver that provides the arcan\_vr binary which
333adds support for various head-mounted displays. More detailed instructions on
334its setup and use can be found as part of the Safespaces project mentioned in
335the 'Related Projects 'section.
336
337## Trayicon
338
339Arcan-trayicon is a tool that chain-loads another arcan client, along with two
340reference images (active and inactive). It tries to register itself in the
341icon-tray of a running arcan application, though it must explicitly enable the
342support. In Durden, this is done via the path:
343
344    global/settings/statusbar/buttons/right/add_external=tray
345
346Then you can use:
347
348    ARCAN_CONNPATH=tray arcan-trayicon active.svg inactive.svg afsrv_terminal
349
350Or some other arcan client that will then be loaded when the tray button is
351clicked, confined into a popup and then killed off as the popup is destroyed.
352This is a quick and convenient way to wrap various system services and external
353command scripts.
354