Browse Source

Continue documentation generation

tags/v1.4.0
Nils 4 years ago
parent
commit
accba9b792
14 changed files with 947 additions and 126 deletions
  1. +5
    -5
      CHANGELOG
  2. +141
    -67
      docs/api/index.html
  3. +563
    -0
      docs/index.html
  4. +0
    -13
      docs/release-checklist.txt
  5. +0
    -0
      docs/src/api/LICENSE
  6. +37
    -40
      docs/src/api/index.adoc
  7. +0
    -0
      docs/src/api/readme.txt
  8. +67
    -0
      docs/src/generate.sh
  9. +27
    -0
      docs/src/index.adoc
  10. +1
    -0
      docs/src/readme-00.md
  11. +46
    -0
      docs/src/readme-01.md
  12. +52
    -0
      docs/src/readme-02.md
  13. +7
    -0
      docs/src/test.txt
  14. +1
    -1
      meson.build

+ 5
- 5
CHANGELOG View File

@@ -1,4 +1,4 @@
v1.4
1.4
Repair nsmd to correctly send client data when running headless and a GUI announces later.
ClientId generation now prevent collision with existing IDs.
nsmd command line option --load-session to directly load one (Berkelder, Rik)
@@ -15,14 +15,14 @@ Legacy-GUI: Scale icons, support more icon formats.
Legacy-GUI: Show all icons and buttons when attaching to a running nsmd session
Legacy-GUI: Various small fixes.

v1.3.2
1.3.2
Rename new-session-manager executable to nsm-legacy-gui to prevent future confusion.

v1.3.1
1.3.1
Add header copyright even to unchanged files to adhere to stricter packaging requirements.
Meson can now switch off individual executables and will stop/error when trying to build without dependencies.

v1.3
1.3
Rebranding to "new session manager"
Upstream GUI tools "non-session-manager" and "nsm-proxy" converted to standard FLTK instead of a custom toolkit
New message /nsm/gui/session/root raises NSM_API_VERSION_MINOR from 0 to 1 (1.0 -> 1.1)
@@ -31,5 +31,5 @@ License upgraded to GPLv3
Simplified file structure
Fix compiler warnings.

v1.2.1
1.2.1
Current state of upstream Non Session Manager v1.2 including unreleased /nsm/gui/session/root

+ 141
- 67
docs/api/index.html View File

@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.10">
<meta name="author" content="Jonathan Moore Liles">
<title>Non Session Manager API</title>
<title>Non Session Manager - API</title>
<style>
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
@@ -438,17 +438,87 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</head>
<body class="article">
<div id="header">
<h1>Non Session Manager API</h1>
<h1>Non Session Manager - API</h1>
<div class="details">
<span id="author" class="author">Jonathan Moore Liles</span><br>
<span id="email" class="email">&lt;<a href="mailto:male@tuxfamily.org">male@tuxfamily.org</a>&gt;</span><br>
<span id="revnumber">version 1.2,</span>
<span id="revdate">2013-04-06</span>
</div>
<div id="toc" class="toc">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_client_behavior_under_session_management">1. Client Behavior Under Session Management</a>
<ul class="sectlevel2">
<li><a href="#_file_menu">1.1. File Menu</a>
<ul class="sectlevel3">
<li><a href="#_new">1.1.1. New</a></li>
<li><a href="#_open">1.1.2. Open</a></li>
<li><a href="#_save">1.1.3. Save</a></li>
<li><a href="#_save_as">1.1.4. Save As</a></li>
<li><a href="#_close_as_distinguished_from_quit_or_exit">1.1.5. Close (as distinguished from Quit or Exit)</a></li>
<li><a href="#_quit_or_exit">1.1.6. Quit or Exit</a></li>
</ul>
</li>
<li><a href="#_data_storage">1.2. Data Storage</a>
<ul class="sectlevel3">
<li><a href="#_internal_files">1.2.1. Internal Files</a></li>
<li><a href="#_external_files">1.2.2. External Files</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_nsm_osc_protocol">2. NSM OSC Protocol</a>
<ul class="sectlevel2">
<li><a href="#_establishing_a_connection">2.1. Establishing a Connection</a>
<ul class="sectlevel3">
<li><a href="#_announce">2.1.1. Announce</a></li>
<li><a href="#_response">2.1.2. Response</a></li>
</ul>
</li>
<li><a href="#_server_to_client_control_messages">2.2. Server to Client Control Messages</a>
<ul class="sectlevel3">
<li><a href="#_quit">2.2.1. Quit</a></li>
<li><a href="#_open_2">2.2.2. Open</a>
<ul class="sectlevel4">
<li><a href="#_response_2">2.2.2.1. Response</a></li>
</ul>
</li>
<li><a href="#_save_2">2.2.3. Save</a>
<ul class="sectlevel4">
<li><a href="#_response_3">2.2.3.1. Response</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_server_to_client_informational_messages">2.3. Server to Client Informational Messages</a>
<ul class="sectlevel3">
<li><a href="#_session_is_loaded">2.3.1. Session is Loaded</a></li>
<li><a href="#_show_optional_gui">2.3.2. Show Optional Gui</a></li>
</ul>
</li>
<li><a href="#_client_to_server_informational_messages">2.4. Client to Server Informational Messages</a>
<ul class="sectlevel3">
<li><a href="#_optional_gui">2.4.1. Optional GUI</a></li>
<li><a href="#_progress">2.4.2. Progress</a></li>
<li><a href="#_dirtiness">2.4.3. Dirtiness</a></li>
<li><a href="#_status_messsages">2.4.4. Status Messsages</a></li>
</ul>
</li>
<li><a href="#_error_code_definitions">2.5. Error Code Definitions</a></li>
<li><a href="#_client_to_server_control">2.6. Client to Server Control</a></li>
<li><a href="#_server_control_api">2.7. Server Control API</a>
<ul class="sectlevel3">
<li><a href="#_client_to_client_communication">2.7.1. Client to Client Communication</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_non_session_management_api">1. Non Session Management API</h2>
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>The Non Session Management API is used by the various components of the Non audio production suite
@@ -480,8 +550,11 @@ these rules are meant to be followed and are non-negotiable. If an application d
this specification it should be considered broken. Consistency across applications under session
management is very important for a good user experience.</p>
</div>
<div class="sect2">
<h3 id="_client_behavior_under_session_management">1.1. Client Behavior Under Session Management</h3>
</div>
</div>
<div class="sect1">
<h2 id="_client_behavior_under_session_management">1. Client Behavior Under Session Management</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Most graphical applications make available to the user a common set of file operations, typically
presented under a File or Project menu.</p>
@@ -496,17 +569,17 @@ an NSM session. These rules only apply when session management is active (that i
consistent and predictable user experience, it is critically important for applications to adhere
to these guidelines.</p>
</div>
<div class="sect2">
<h3 id="_file_menu">1.1. File Menu</h3>
<div class="sect3">
<h4 id="_file_menu">1.1.1. File Menu</h4>
<div class="sect4">
<h5 id="_new">1.1.1.1. New</h5>
<h4 id="_new">1.1.1. New</h4>
<div class="paragraph">
<p>This option may empty/reset the current file or project (possibly after user confirmation). UNDER
NO CIRCUMSTANCES should it allow the user to create a new project/file in another location.</p>
</div>
</div>
<div class="sect4">
<h5 id="_open">1.1.1.2. Open</h5>
<div class="sect3">
<h4 id="_open">1.1.2. Open</h4>
<div class="paragraph">
<p>This option MUST be disabled.</p>
</div>
@@ -515,8 +588,8 @@ NO CIRCUMSTANCES should it allow the user to create a new project/file in anothe
copy of a file/project which is then saved at the session path provided by NSM.</p>
</div>
</div>
<div class="sect4">
<h5 id="_save">1.1.1.3. Save</h5>
<div class="sect3">
<h4 id="_save">1.1.3. Save</h4>
<div class="paragraph">
<p>This option should behave as normal, saving the current file/project as established by the NSM
<code>open</code> message.</p>
@@ -525,8 +598,8 @@ copy of a file/project which is then saved at the session path provided by NSM.<
<p>UNDER NO CIRCUMSTANCES should this option present the user with a choice of where to save the file.</p>
</div>
</div>
<div class="sect4">
<h5 id="_save_as">1.1.1.4. Save As</h5>
<div class="sect3">
<h4 id="_save_as">1.1.4. Save As</h4>
<div class="paragraph">
<p>This option MUST be disabled.</p>
</div>
@@ -536,24 +609,24 @@ creates a copy of the current file/project which is then saved in a user-specifi
of the session path provided by NSM.</p>
</div>
</div>
<div class="sect4">
<h5 id="_close_as_distinguished_from_quit_or_exit">1.1.1.5. Close (as distinguished from Quit or Exit)</h5>
<div class="sect3">
<h4 id="_close_as_distinguished_from_quit_or_exit">1.1.5. Close (as distinguished from Quit or Exit)</h4>
<div class="paragraph">
<p>This option MUST be disabled unless its meaning is to disconnect the application from session
management.</p>
</div>
</div>
<div class="sect4">
<h5 id="_quit_or_exit">1.1.1.6. Quit or Exit</h5>
<div class="sect3">
<h4 id="_quit_or_exit">1.1.6. Quit or Exit</h4>
<div class="paragraph">
<p>This option may behave as normal (possibly asking the user to confirm exiting).</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_data_storage">1.2. Data Storage</h3>
<div class="sect3">
<h4 id="_data_storage">1.1.2. Data Storage</h4>
<div class="sect4">
<h5 id="_internal_files">1.1.2.1. Internal Files</h5>
<h4 id="_internal_files">1.2.1. Internal Files</h4>
<div class="paragraph">
<p>All project specific data created by a client MUST be stored in the per-client storage area
provided by NSM. This includes all recorded audio and MIDI files, snapshots, etc. Only global
@@ -561,8 +634,8 @@ configuration items, exports, and renders of the project may be stored elsewhere
specifies).</p>
</div>
</div>
<div class="sect4">
<h5 id="_external_files">1.1.2.2. External Files</h5>
<div class="sect3">
<h4 id="_external_files">1.2.2. External Files</h4>
<div class="paragraph">
<p>Files required by the project but external to it (typically read-only data such as audio samples)
SHOULD be referenced by creating a symbolic link within the assigned session area, and then
@@ -574,8 +647,10 @@ to (some unique component may be required to prevent collisions)</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_nsm_osc_protocol">1.2. NSM OSC Protocol</h3>
</div>
<div class="sect1">
<h2 id="_nsm_osc_protocol">2. NSM OSC Protocol</h2>
<div class="sectionbody">
<div class="paragraph">
<p>All message parameters are REQUIRED. All messages MUST be sent from the same socket as the <code>announce</code>
message, using the <code>lo_send_from</code> method of liblo or its equivalent, as the server uses the return
@@ -585,10 +660,10 @@ addresses to distinguish between clients.</p>
<p>Clients MUST create thier OSC servers using the same protocol (UDP,TCP) as found in <code>NSM_URL</code>. liblo
is lacking a robust TCP implementation at the time of writing, but in the future it may be useful.</p>
</div>
<div class="sect2">
<h3 id="_establishing_a_connection">2.1. Establishing a Connection</h3>
<div class="sect3">
<h4 id="_establishing_a_connection">1.2.1. Establishing a Connection</h4>
<div class="sect4">
<h5 id="_announce">1.2.1.1. Announce</h5>
<h4 id="_announce">2.1.1. Announce</h4>
<div class="paragraph">
<p>At launch, the client MUST check the environment for the value of <code>NSM_URL</code>. If present, the client
MUST send the following message to the provided address as soon as it is ready to respond to the
@@ -663,8 +738,8 @@ like Python can be more challenging.</p>
</tbody>
</table>
</div>
<div class="sect4">
<h5 id="_response">1.2.1.2. Response</h5>
<div class="sect3">
<h4 id="_response">2.1.2. Response</h4>
<div class="paragraph">
<p>The server will respond to the client&#8217;s announce message with the following message:</p>
</div>
@@ -757,8 +832,8 @@ For example, the Non applications activate their "SM" blinkers at this time.</p>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_server_to_client_control_messages">1.2.2. Server to Client Control Messages</h4>
<div class="sect2">
<h3 id="_server_to_client_control_messages">2.2. Server to Client Control Messages</h3>
<div class="paragraph">
<p>Compliant clients MUST accept the client control messages described in this section. All client
control messages REQUIRE a response. Responses MUST be delivered back to the sender (NSM) from the
@@ -785,8 +860,8 @@ replied to (e.g. "nsm/client/save":</p>
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/error s:path i:error_code s:message</code></pre>
</div>
</div>
<div class="sect4">
<h5 id="_quit">1.2.2.1. Quit</h5>
<div class="sect3">
<h4 id="_quit">2.2.1. Quit</h4>
<div class="paragraph">
<p>There is no message for this. Clients will receive the Unix SIGTERM signal and MUST close cleanly
IMMEDIATELY, without displaying any kind of dialog to the user and regardless of whether or not
@@ -794,8 +869,8 @@ unsaved changes would be lost. When a session is closed the application will rec
soon after having responded to a <code>save</code> message.</p>
</div>
</div>
<div class="sect4">
<h5 id="_open_2">1.2.2.2. Open</h5>
<div class="sect3">
<h4 id="_open_2">2.2.2. Open</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/open s:path_to_instance_specific_project s:display_name s:client_id</code></pre>
@@ -862,8 +937,8 @@ renaming existing clients, although this is a sorely needed addition.</p>
<p>A response is REQUIRED as soon as the open operation has been completed. Ongoing progress may be
indicated by sending messages to <code>/nsm/client/progress</code>.</p>
</div>
<div class="sect5">
<h6 id="_response_2">Response</h6>
<div class="sect4">
<h5 id="_response_2">2.2.2.1. Response</h5>
<div class="paragraph">
<p>The client MUST respond to the 'open' message with:</p>
</div>
@@ -917,8 +992,8 @@ indicated by sending messages to <code>/nsm/client/progress</code>.</p>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_save_2">1.2.2.3. Save</h5>
<div class="sect3">
<h4 id="_save_2">2.2.3. Save</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/save</code></pre>
@@ -928,8 +1003,8 @@ indicated by sending messages to <code>/nsm/client/progress</code>.</p>
<p>This message will only be delivered after a previous <code>open</code> message, and may be sent any number of
times within the course of a session (including zero, if the user aborts the session).</p>
</div>
<div class="sect5">
<h6 id="_response_3">Response</h6>
<div class="sect4">
<h5 id="_response_3">2.2.3.1. Response</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/reply "/nsm/client/save" s:message</code></pre>
@@ -973,10 +1048,10 @@ times within the course of a session (including zero, if the user aborts the ses
</div>
</div>
</div>
<div class="sect2">
<h3 id="_server_to_client_informational_messages">2.3. Server to Client Informational Messages</h3>
<div class="sect3">
<h4 id="_server_to_client_informational_messages">1.2.3. Server to Client Informational Messages</h4>
<div class="sect4">
<h5 id="_session_is_loaded">1.2.3.1. Session is Loaded</h5>
<h4 id="_session_is_loaded">2.3.1. Session is Loaded</h4>
<div class="paragraph">
<p>Accepting this message is optional. The intent is to signal to clients which may have some
interdependence (say, peer to peer OSC connections) that the session is fully loaded and all their
@@ -993,8 +1068,8 @@ on this message MUST not do so by delaying initialization waiting for it.</p>
<p>This message does not require a response.</p>
</div>
</div>
<div class="sect4">
<h5 id="_show_optional_gui">1.2.3.2. Show Optional Gui</h5>
<div class="sect3">
<h4 id="_show_optional_gui">2.3.2. Show Optional Gui</h4>
<div class="paragraph">
<p>If the client has specified the <code>optional-gui</code> capability, then it may receive this message from the
server when the user wishes to change the visibility state of the GUI. It doesn&#8217;t matter if the
@@ -1017,10 +1092,10 @@ separate program, it should be killed.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_client_to_server_informational_messages">2.4. Client to Server Informational Messages</h3>
<div class="sect3">
<h4 id="_client_to_server_informational_messages">1.2.4. Client to Server Informational Messages</h4>
<div class="sect4">
<h5 id="_optional_gui">1.2.4.1. Optional GUI</h5>
<h4 id="_optional_gui">2.4.1. Optional GUI</h4>
<div class="paragraph">
<p>If the client has specified the <code>optional-gui</code> capability, then it MUST send this message whenever
the state of visibility of the optional GUI has changed. It also MUST send this message after it&#8217;s
@@ -1044,8 +1119,8 @@ loads.</p>
<p>No response will be delivered.</p>
</div>
</div>
<div class="sect4">
<h5 id="_progress">1.2.4.2. Progress</h5>
<div class="sect3">
<h4 id="_progress">2.4.2. Progress</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/progress f:progress</code></pre>
@@ -1068,8 +1143,8 @@ message is still REQUIRED.</p>
capability string.</p>
</div>
</div>
<div class="sect4">
<h5 id="_dirtiness">1.2.4.3. Dirtiness</h5>
<div class="sect3">
<h4 id="_dirtiness">2.4.3. Dirtiness</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/is_dirty</code></pre>
@@ -1088,8 +1163,8 @@ may optionally send <code>is_dirty</code> and <code>is_clean</code> messages.</p
<p>Clients which have this capability should include <code>:dirty:</code> in their <code>announce</code> capability string.</p>
</div>
</div>
<div class="sect4">
<h5 id="_status_messsages">1.2.4.4. Status Messsages</h5>
<div class="sect3">
<h4 id="_status_messsages">2.4.4. Status Messsages</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/message i:priority s:message</code></pre>
@@ -1106,8 +1181,8 @@ string.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_error_code_definitions">1.2.5. Error Code Definitions</h4>
<div class="sect2">
<h3 id="_error_code_definitions">2.5. Error Code Definitions</h3>
<table class="tableblock frame-all grid-all stripes-even stretch">
<caption class="title">Table 6. Error Code Definitions</caption>
<colgroup>
@@ -1164,8 +1239,8 @@ string.</p>
</tbody>
</table>
</div>
<div class="sect3">
<h4 id="_client_to_server_control">1.2.6. Client to Server Control</h4>
<div class="sect2">
<h3 id="_client_to_server_control">2.6. Client to Server Control</h3>
<div class="paragraph">
<p>If the server publishes the <code>:server_control:</code> capability, then clients can also initiate action by
the server. For example, a client might implement a 'Save All' option which sends a
@@ -1173,8 +1248,8 @@ the server. For example, a client might implement a 'Save All' option which send
management interface to effect the save.</p>
</div>
</div>
<div class="sect3">
<h4 id="_server_control_api">1.2.7. Server Control API</h4>
<div class="sect2">
<h3 id="_server_control_api">2.7. Server Control API</h3>
<div class="paragraph">
<p>The session manager not only manages clients via OSC, but it is itself controlled via OSC messages.
The server responds to the following messages.</p>
@@ -1330,8 +1405,8 @@ error.</p>
</li>
</ul>
</div>
<div class="sect4">
<h5 id="_client_to_client_communication">1.2.7.1. Client to Client Communication</h5>
<div class="sect3">
<h4 id="_client_to_client_communication">2.7.1. Client to Client Communication</h4>
<div class="paragraph">
<p>If the server includes <code>:broadcast:</code> in its capability string, then clients may send broadcast
messages to each other through the NSM server. Clients may send messages to the server at the path
@@ -1375,11 +1450,10 @@ of which might respond to the message by updating their own tempo maps.</p>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Version 1.2<br>
Last updated 2020-07-06 18:12:58 +0200
Last updated 2020-07-06 22:15:39 +0200
</div>
</div>
</body>

+ 563
- 0
docs/index.html View File

@@ -0,0 +1,563 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.10">
<meta name="author" content="LinuxAudio.org">
<title>New Session Manager Documentation</title>
<style>
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
:not(pre)>code.nobreak{word-wrap:normal}
:not(pre)>code.nowrap{white-space:nowrap}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
table.tableblock{max-width:100%;border-collapse:separate}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot,table.frame-ends{border-width:1px 0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article">
<div id="header">
<h1>New Session Manager Documentation</h1>
<div class="details">
<span id="author" class="author">LinuxAudio.org</span><br>
<span id="revnumber">version 1.4</span>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><a href="https://github.com/linuxaudio/new-session-manager">Sourcecode</a></p>
</li>
<li>
<p><a href="https://github.com/linuxaudio/new-session-manager/issues">Bug and Issue Tracker</a></p>
</li>
<li>
<p><a href="api/index.html">API</a> document that describes all OSC Messages</p>
</li>
<li>
<p><a href="http://non.tuxfamily.org/session-manager/doc/MANUAL.html">Legacy-GUI Manual</a>. The original Non-Session-Manager manual is still valid.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>New Session Manager (NSM) is a tool to assist music production by grouping standalone programs into sessions.
Your workflow becomes easy to manage, robust and fast by leveraging the full potential of cooperative applications.</p>
</div>
<div class="paragraph">
<p>It is a community version of the "NON Session Manager" and free in every sense of the word:
free of cost, free to share and use, free of spyware or ads, free-and-open-source.</p>
</div>
<div class="paragraph">
<p>You can create a session, or project, add programs to it and then use commands to save, start/stop,
hide/show all programs at once, or individually. At a later date you can then re-open the session
and continue where you left off.</p>
</div>
<div class="paragraph">
<p>All files belonging to the session will be saved in the same directory.</p>
</div>
<div class="paragraph">
<p>If you are a user (and not a programmer or packager) everything you need is to install NSM
through your distributions package manager and, highly recommended, Argodejo as a GUI (see below).</p>
</div>
<div class="paragraph">
<p>To learn NSM you don&#8217;t need to know the background information from our documentation, which
is aimed at developers that want to implement NSM support in their programs. Learn the GUI,
not the server and protocol.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_bullet_points">Bullet Points</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>Drop-In replacement for the non-session-manager daemon nsmd and tools (e.g. jackpatch)</p>
</li>
<li>
<p>Simple and hassle-free build system to make packaging easy</p>
</li>
<li>
<p>Possibility to react to sensible bug fixes that would not have been integrated original nsmd</p>
</li>
<li>
<p>Stay upwards and downwards compatible with original nsmd</p>
</li>
<li>
<p>Conservative and hesitant in regards to new features and behaviour-changes, but possible in principle</p>
</li>
<li>
<p>Keep the session-manager separate from the other NON* tools Mixer, Sequencer and Timeline.</p>
</li>
<li>
<p>Protect nsmd from vanishing from the internet one day.</p>
</li>
<li>
<p>The goal is to become the de-facto standard session manager for Linux distributions</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_user_interface">User Interface</h2>
<div class="sectionbody">
<div class="paragraph">
<p>It is highly recommended to use Argodejo ( <a href="https://www.laborejo.org/argodejo/" class="bare">https://www.laborejo.org/argodejo/</a> ) as graphical
user interface. In fact, if you install Argodejo in you distribution it will install NSM as
dependency and you don&#8217;t need to do anything yourself with this software package.</p>
</div>
<div class="paragraph">
<p>This repository also contains the legacy FLTK interface simply called <code>nsm-legacy-gui</code>,
symlinked to <code>non-session-manager</code> for backwards compatibility. (e.g. autostart scripts etc.)</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_supported_clients">Supported Clients</h2>
<div class="sectionbody">
<div class="paragraph">
<p>While NSM can start and stop any program it only becomes convenient if clients specifically
implement support. This enables saving and hiding the GUI, amongst other features.
Documentation and tutorials for software-developers will be added at a later date.</p>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Version 1.4<br>
Last updated 2020-07-06 22:15:39 +0200
</div>
</div>
</body>
</html>

+ 0
- 13
docs/release-checklist.txt View File

@@ -1,13 +0,0 @@
This is an internal reminder what to check and change before a release.

/documentation/API/api.adoc
:revnumber:
:revdate:

Version number in /meson.build (one occurence)
Version number and changes in /CHANGELOG
Regenerate API and Website html to update the date in their footer

We do not change the copyright date in file license-headers. That is not required by law and only
exist to mark to year of the fork. In the future it might be removed completely.


docs/api/LICENSE → docs/src/api/LICENSE View File


docs/api/api.adoc → docs/src/api/index.adoc View File

@@ -1,8 +1,9 @@
////
This is not an "asciidoctor", not plain "asciidoc" document.
This is "asciidoctor", not plain "asciidoc".
https://asciidoctor.org/docs/user-manual/
////


////
This documentation is licensed under the Creative Commons Attribution-ShareAlike 2.5 International License.
To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/2.5/legalcode or send a
@@ -14,7 +15,6 @@ A copy of the license has been provided in the file documentation/API/LICENSE.
:authors: Jonathan Moore Liles
:email: <male@tuxfamily.org>
:revnumber: 1.2
:revdate: 2013-04-06

:iconfont-remote!:
:!webfonts:
@@ -22,15 +22,12 @@ A copy of the license has been provided in the file documentation/API/LICENSE.
:sectnums:
:sectnumlevels: 4

:toc: preamble
:toc:
:toc-title: Table of Contents
:toclevels: 4


= Non Session Manager API


== Non Session Management API
= Non Session Manager - API

The Non Session Management API is used by the various components of the Non audio production suite
to allow any number of independent programs to be managed together as part of a logical session
@@ -58,7 +55,7 @@ this specification it should be considered broken. Consistency across applicatio
management is very important for a good user experience.


=== Client Behavior Under Session Management
== Client Behavior Under Session Management

Most graphical applications make available to the user a common set of file operations, typically
presented under a File or Project menu.
@@ -72,16 +69,16 @@ consistent and predictable user experience, it is critically important for appli
to these guidelines.


==== File Menu
=== File Menu


===== New
==== New

This option may empty/reset the current file or project (possibly after user confirmation). UNDER
NO CIRCUMSTANCES should it allow the user to create a new project/file in another location.


===== Open
==== Open

This option MUST be disabled.

@@ -89,7 +86,7 @@ The application may, however, elect to implement an option called 'Import into S
copy of a file/project which is then saved at the session path provided by NSM.


===== Save
==== Save

This option should behave as normal, saving the current file/project as established by the NSM
`open` message.
@@ -97,7 +94,7 @@ This option should behave as normal, saving the current file/project as establis
UNDER NO CIRCUMSTANCES should this option present the user with a choice of where to save the file.


===== Save As
==== Save As

This option MUST be disabled.

@@ -106,21 +103,21 @@ creates a copy of the current file/project which is then saved in a user-specifi
of the session path provided by NSM.


===== Close (as distinguished from Quit or Exit)
==== Close (as distinguished from Quit or Exit)

This option MUST be disabled unless its meaning is to disconnect the application from session
management.


===== Quit or Exit
==== Quit or Exit

This option may behave as normal (possibly asking the user to confirm exiting).


==== Data Storage
=== Data Storage


===== Internal Files
==== Internal Files

All project specific data created by a client MUST be stored in the per-client storage area
provided by NSM. This includes all recorded audio and MIDI files, snapshots, etc. Only global
@@ -128,7 +125,7 @@ configuration items, exports, and renders of the project may be stored elsewhere
specifies).


===== External Files
==== External Files

Files required by the project but external to it (typically read-only data such as audio samples)
SHOULD be referenced by creating a symbolic link within the assigned session area, and then
@@ -139,7 +136,7 @@ to (some unique component may be required to prevent collisions)



=== NSM OSC Protocol
== NSM OSC Protocol

All message parameters are REQUIRED. All messages MUST be sent from the same socket as the `announce`
message, using the `lo_send_from` method of liblo or its equivalent, as the server uses the return
@@ -150,9 +147,9 @@ Clients MUST create thier OSC servers using the same protocol (UDP,TCP) as found
is lacking a robust TCP implementation at the time of writing, but in the future it may be useful.


==== Establishing a Connection
=== Establishing a Connection

===== Announce
==== Announce

At launch, the client MUST check the environment for the value of `NSM_URL`. If present, the client
MUST send the following message to the provided address as soon as it is ready to respond to the
@@ -201,7 +198,7 @@ like Python can be more challenging.
|===


===== Response
==== Response

The server will respond to the client's announce message with the following message:

@@ -257,7 +254,7 @@ The following table defines possible values of `error_code`:
|===


==== Server to Client Control Messages
=== Server to Client Control Messages

Compliant clients MUST accept the client control messages described in this section. All client
control messages REQUIRE a response. Responses MUST be delivered back to the sender (NSM) from the
@@ -283,7 +280,7 @@ replied to (e.g. "nsm/client/save":
----


===== Quit
==== Quit

There is no message for this. Clients will receive the Unix SIGTERM signal and MUST close cleanly
IMMEDIATELY, without displaying any kind of dialog to the user and regardless of whether or not
@@ -291,7 +288,7 @@ unsaved changes would be lost. When a session is closed the application will rec
soon after having responded to a `save` message.


===== Open
==== Open

[source%nowrap,OSC]
----
@@ -349,7 +346,7 @@ A response is REQUIRED as soon as the open operation has been completed. Ongoing
indicated by sending messages to `/nsm/client/progress`.


====== Response
===== Response

The client MUST respond to the 'open' message with:

@@ -381,7 +378,7 @@ Or
|===


===== Save
==== Save

[source%nowrap,OSC]
----
@@ -391,7 +388,7 @@ Or
This message will only be delivered after a previous `open` message, and may be sent any number of
times within the course of a session (including zero, if the user aborts the session).

====== Response
===== Response

[source%nowrap,OSC]
----
@@ -419,9 +416,9 @@ Or
|===


==== Server to Client Informational Messages
=== Server to Client Informational Messages

===== Session is Loaded
==== Session is Loaded

Accepting this message is optional. The intent is to signal to clients which may have some
interdependence (say, peer to peer OSC connections) that the session is fully loaded and all their
@@ -437,7 +434,7 @@ on this message MUST not do so by delaying initialization waiting for it.
This message does not require a response.


===== Show Optional Gui
==== Show Optional Gui

If the client has specified the `optional-gui` capability, then it may receive this message from the
server when the user wishes to change the visibility state of the GUI. It doesn't matter if the
@@ -459,9 +456,9 @@ No response is message is required.



==== Client to Server Informational Messages
=== Client to Server Informational Messages

===== Optional GUI
==== Optional GUI

If the client has specified the `optional-gui` capability, then it MUST send this message whenever
the state of visibility of the optional GUI has changed. It also MUST send this message after it's
@@ -483,7 +480,7 @@ loads.
No response will be delivered.


===== Progress
==== Progress

[source%nowrap,OSC]
----
@@ -503,7 +500,7 @@ Clients which intend to send progress messages should include `:progress:` in th
capability string.


===== Dirtiness
==== Dirtiness

[source%nowrap,OSC]
----
@@ -520,7 +517,7 @@ may optionally send `is_dirty` and `is_clean` messages.

Clients which have this capability should include `:dirty:` in their `announce` capability string.

===== Status Messsages
==== Status Messsages

[source%nowrap,OSC]
----
@@ -535,7 +532,7 @@ Clients which have this capability should include `:message:` in their `announce
string.


==== Error Code Definitions
=== Error Code Definitions

.Error Code Definitions
[options="header", stripes=even]
@@ -556,7 +553,7 @@ string.

|===

==== Client to Server Control
=== Client to Server Control

If the server publishes the `:server_control:` capability, then clients can also initiate action by
the server. For example, a client might implement a 'Save All' option which sends a
@@ -564,7 +561,7 @@ the server. For example, a client might implement a 'Save All' option which send
management interface to effect the save.


==== Server Control API
=== Server Control API

The session manager not only manages clients via OSC, but it is itself controlled via OSC messages.
The server responds to the following messages.
@@ -632,7 +629,7 @@ The possible errors are:



===== Client to Client Communication
==== Client to Client Communication

If the server includes `:broadcast:` in its capability string, then clients may send broadcast
messages to each other through the NSM server. Clients may send messages to the server at the path

docs/api/readme.txt → docs/src/api/readme.txt View File


+ 67
- 0
docs/src/generate.sh View File

@@ -0,0 +1,67 @@
#!/bin/sh


#The documentation is built statically and does not belong to the normal build process.
#Updating is part of the development process, not compiling or packaging.
#Run this before a release, or any time you want to update the docs or the README.

#This script takes common snippets of information and updates or generates source info files from
#them.
# parse src/nsmd.cpp for API version, insert into /docs/src/api/index.adoc
# parse /CHANGELOG first line for package version, insert into /meson.build and /docs/src/index.adoc
# generate /README.md (shares text with manual index)
# generate /docs/src/index.adoc (shares text with readme)
# generate manpages (need all kind of information)
# convert all .adoc files to html in /docs/ (This enables github to directly present this dir as website)
#
#We do _not_ change the copyright date in files license-headers.
#They only exist to mark to year of the fork. In the future dates might be removed completely.

set -e #Stop script on errors
set -u #Trace unset variables as an error.

#Change pwd to root dir
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd "$parent_path"/../..
[ -f "CHANGELOG" ] || exit 1 #assert correct dir

#Gather data
ROOT=$(pwd) #save for later
VERSION=$(head -n 1 "CHANGELOG")

_MAJORAPI=$(grep "define NSM_API_VERSION_MAJOR" "src/nsmd.cpp" | cut -d ' ' -f 3)
_MINORAPI=$(grep "define NSM_API_VERSION_MINOR" "src/nsmd.cpp" | cut -d ' ' -f 3)
APIVERSION=$_MAJORAPI"."$_MINORAPI

#Present data to confirm write-action
echo "Root: $ROOT"
echo "Version: $VERSION"
echo "API Version: $APIVERSION"
read -p "Is parsed data correct? Continue by writing files? [y|n] " -n 1 -r
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
echo
echo "Abort"
exit 1
fi
echo

#Package Version Number
cd "$ROOT/docs/src"
sed -i '/^\:revnumber.*/c\:revnumber: '$VERSION index.adoc #Find the revnumber line and replace with entire new line

#API Version Number
cd "$ROOT/docs/src/api"
sed -i '/^\:revnumber.*/c\:revnumber: '$APIVERSION index.adoc #Find the revnumber line and replace with entire new line


#Generate README.md
cd "$ROOT/docs/src"
cat "readme-00.md" "readme-01.md" "readme-02.md" > "$ROOT/README.md"


#Generate website and documentation with Asciidoctor
cd "$ROOT/docs"
mkdir -p "api"
asciidoctor src/index.adoc -o index.html
asciidoctor src/api/index.adoc -o api/index.html

+ 27
- 0
docs/src/index.adoc View File

@@ -0,0 +1,27 @@
////
This is "asciidoctor", not plain "asciidoc".
https://asciidoctor.org/docs/user-manual/
////


////
This documentation is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a
letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
A copy of the license has been provided in the file documentation/LICENSE.
////

:Author: LinuxAudio.org
:iconfont-remote!:
:!webfonts:
:revnumber: 1.4

= New Session Manager Documentation

* link:https://github.com/linuxaudio/new-session-manager[Sourcecode]
* link:https://github.com/linuxaudio/new-session-manager/issues[Bug and Issue Tracker]
* link:api/index.html[API] document that describes all OSC Messages
* link:http://non.tuxfamily.org/session-manager/doc/MANUAL.html[Legacy-GUI Manual]. The original Non-Session-Manager manual is still valid.


include::readme-01.md[]

+ 1
- 0
docs/src/readme-00.md View File

@@ -0,0 +1 @@
# New Session Manager

+ 46
- 0
docs/src/readme-01.md View File

@@ -0,0 +1,46 @@

## Introduction

New Session Manager (NSM) is a tool to assist music production by grouping standalone programs into sessions.
Your workflow becomes easy to manage, robust and fast by leveraging the full potential of cooperative applications.

It is a community version of the "NON Session Manager" and free in every sense of the word:
free of cost, free to share and use, free of spyware or ads, free-and-open-source.

You can create a session, or project, add programs to it and then use commands to save, start/stop,
hide/show all programs at once, or individually. At a later date you can then re-open the session
and continue where you left off.

All files belonging to the session will be saved in the same directory.

If you are a user (and not a programmer or packager) everything you need is to install NSM
through your distributions package manager and, highly recommended, Argodejo as a GUI (see below).

To learn NSM you don't need to know the background information from our documentation, which
is aimed at developers that want to implement NSM support in their programs. Learn the GUI,
not the server and protocol.


## Bullet Points
* Drop-In replacement for the non-session-manager daemon nsmd and tools (e.g. jackpatch)
* Simple and hassle-free build system to make packaging easy
* Possibility to react to sensible bug fixes that would not have been integrated original nsmd
* Stay upwards and downwards compatible with original nsmd
* Conservative and hesitant in regards to new features and behaviour-changes, but possible in principle
* Keep the session-manager separate from the other NON* tools Mixer, Sequencer and Timeline.
* Protect nsmd from vanishing from the internet one day.
* The goal is to become the de-facto standard session manager for Linux distributions

## User Interface
It is highly recommended to use Argodejo ( https://www.laborejo.org/argodejo/ ) as graphical
user interface. In fact, if you install Argodejo in you distribution it will install NSM as
dependency and you don't need to do anything yourself with this software package.

This repository also contains the legacy FLTK interface simply called `nsm-legacy-gui`,
symlinked to `non-session-manager` for backwards compatibility. (e.g. autostart scripts etc.)

## Supported Clients

While NSM can start and stop any program it only becomes convenient if clients specifically
implement support. This enables saving and hiding the GUI, amongst other features.
Documentation and tutorials for software-developers will be added at a later date.

+ 52
- 0
docs/src/readme-02.md View File

@@ -0,0 +1,52 @@

## Fork and License
This is a fork of non-session-manager, by Jonathan Moore Liles <male@tuxfamily.net> http://non.tuxfamily.org/
which was released under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

All files, except nsm.h kept in this fork were GPL "version 2 of the License, or (at your
option) any later version."

`nsm.h` is licensed under the ISCL.

New-Session-Manager changed the license to GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007.
See file COPYING

## Build
The build system is meson.

This is a software package that will compile and install multiple executables:
* `nsmd`, the daemon or server itself. It is mandatory.
* It has no GUI.
* Dependency is `liblo`, the OSC library.
* `jackpatch`, NSM client to save and remember JACK connections.
* It has no GUI.
* Dependencies are `JACK Audio Connection Kit` and `liblo`, the OSC library.
* Can be deactivated (see below) `-Djackpatch=false`
* `nsm-legacy-gui`, Legacy GUI for the user
* Formerly known as "non-session-manager"
* Dependencies are `FLTK`>=v1.3.0 and `liblo`, the OSC library.
* Can be deactivated (see below) `-Dlegacy-gui=false`
* `nsm-proxy`, NSM GUI Client to run any program without direct NSM support
* Dependencies are `FLTK`>=v1.3.0, `fluid` (FLTK Editor/compiler, maybe in the same package as FLTK, maybe not) and `liblo`, the OSC library.
* Can be deactivated (see below) `-Dnsm-proxy=false`


```
meson build --prefix=/usr
#or disable individual build targets:
#meson build --prefix=/usr -Dlegacy-gui=false -Dnsm-proxy=false -Djackpatch=false
cd build && ninja
sudo ninja install
```

Optionally you can skip `sudo ninja install` and run all executables from the build-dir.
In this case you need to add the build-dir to your PATH environment variable so that the tools
can find each other.

## Names of Executable Files and Symlinks

Some distributions (and possibly local laws) prevent a forked software project from creating
executable files under the same name, if the name itself is an original work subject to copyright,
which it arguably is for the "NON-"-suite. Therefore New Session Manager renamed
`non-session-manager` to `nsm-legacy-gui`. Installing will also create a symlink to
`non-session-manager` for backwards compatibility. (e.g. autostart scripts etc.).

+ 7
- 0
docs/src/test.txt View File

@@ -0,0 +1,7 @@
Hallo Welt

Lol Rolf

== Cool Cool

Cool

+ 1
- 1
meson.build View File

@@ -17,7 +17,7 @@
# along with New-Session-Manager. If not, see <https://www.gnu.org/licenses/>.
##############################################################################

project('new-session-manager', 'c', 'cpp', version : '1.3.1', license : 'GPLv3')
project('new-session-manager', 'c', 'cpp', version : '1.4', license : 'GPLv3')

##############
#Dependencies


Loading…
Cancel
Save