@@ -1,4 +1,4 @@ | |||||
v1.4 | |||||
1.4 | |||||
Repair nsmd to correctly send client data when running headless and a GUI announces later. | Repair nsmd to correctly send client data when running headless and a GUI announces later. | ||||
ClientId generation now prevent collision with existing IDs. | ClientId generation now prevent collision with existing IDs. | ||||
nsmd command line option --load-session to directly load one (Berkelder, Rik) | 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: Show all icons and buttons when attaching to a running nsmd session | ||||
Legacy-GUI: Various small fixes. | Legacy-GUI: Various small fixes. | ||||
v1.3.2 | |||||
1.3.2 | |||||
Rename new-session-manager executable to nsm-legacy-gui to prevent future confusion. | 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. | 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. | 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" | Rebranding to "new session manager" | ||||
Upstream GUI tools "non-session-manager" and "nsm-proxy" converted to standard FLTK instead of a custom toolkit | 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) | 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 | Simplified file structure | ||||
Fix compiler warnings. | Fix compiler warnings. | ||||
v1.2.1 | |||||
1.2.1 | |||||
Current state of upstream Non Session Manager v1.2 including unreleased /nsm/gui/session/root | Current state of upstream Non Session Manager v1.2 including unreleased /nsm/gui/session/root |
@@ -6,7 +6,7 @@ | |||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
<meta name="generator" content="Asciidoctor 2.0.10"> | <meta name="generator" content="Asciidoctor 2.0.10"> | ||||
<meta name="author" content="Jonathan Moore Liles"> | <meta name="author" content="Jonathan Moore Liles"> | ||||
<title>Non Session Manager API</title> | |||||
<title>Non Session Manager - API</title> | |||||
<style> | <style> | ||||
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ | /* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ | ||||
/* Uncomment @import statement to use as custom stylesheet */ | /* 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> | </head> | ||||
<body class="article"> | <body class="article"> | ||||
<div id="header"> | <div id="header"> | ||||
<h1>Non Session Manager API</h1> | |||||
<h1>Non Session Manager - API</h1> | |||||
<div class="details"> | <div class="details"> | ||||
<span id="author" class="author">Jonathan Moore Liles</span><br> | <span id="author" class="author">Jonathan Moore Liles</span><br> | ||||
<span id="email" class="email"><<a href="mailto:male@tuxfamily.org">male@tuxfamily.org</a>></span><br> | <span id="email" class="email"><<a href="mailto:male@tuxfamily.org">male@tuxfamily.org</a>></span><br> | ||||
<span id="revnumber">version 1.2,</span> | <span id="revnumber">version 1.2,</span> | ||||
<span id="revdate">2013-04-06</span> | <span id="revdate">2013-04-06</span> | ||||
</div> | </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> | ||||
<div id="content"> | <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="sectionbody"> | ||||
<div class="paragraph"> | <div class="paragraph"> | ||||
<p>The Non Session Management API is used by the various components of the Non audio production suite | <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 | this specification it should be considered broken. Consistency across applications under session | ||||
management is very important for a good user experience.</p> | management is very important for a good user experience.</p> | ||||
</div> | </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"> | <div class="paragraph"> | ||||
<p>Most graphical applications make available to the user a common set of file operations, typically | <p>Most graphical applications make available to the user a common set of file operations, typically | ||||
presented under a File or Project menu.</p> | 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 | consistent and predictable user experience, it is critically important for applications to adhere | ||||
to these guidelines.</p> | to these guidelines.</p> | ||||
</div> | </div> | ||||
<div class="sect2"> | |||||
<h3 id="_file_menu">1.1. File Menu</h3> | |||||
<div class="sect3"> | <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"> | <div class="paragraph"> | ||||
<p>This option may empty/reset the current file or project (possibly after user confirmation). UNDER | <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> | NO CIRCUMSTANCES should it allow the user to create a new project/file in another location.</p> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>This option MUST be disabled.</p> | <p>This option MUST be disabled.</p> | ||||
</div> | </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> | copy of a file/project which is then saved at the session path provided by NSM.</p> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>This option should behave as normal, saving the current file/project as established by the NSM | <p>This option should behave as normal, saving the current file/project as established by the NSM | ||||
<code>open</code> message.</p> | <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> | <p>UNDER NO CIRCUMSTANCES should this option present the user with a choice of where to save the file.</p> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>This option MUST be disabled.</p> | <p>This option MUST be disabled.</p> | ||||
</div> | </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> | of the session path provided by NSM.</p> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>This option MUST be disabled unless its meaning is to disconnect the application from session | <p>This option MUST be disabled unless its meaning is to disconnect the application from session | ||||
management.</p> | management.</p> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>This option may behave as normal (possibly asking the user to confirm exiting).</p> | <p>This option may behave as normal (possibly asking the user to confirm exiting).</p> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="sect2"> | |||||
<h3 id="_data_storage">1.2. Data Storage</h3> | |||||
<div class="sect3"> | <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"> | <div class="paragraph"> | ||||
<p>All project specific data created by a client MUST be stored in the per-client storage area | <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 | 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> | specifies).</p> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>Files required by the project but external to it (typically read-only data such as audio samples) | <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 | 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> | ||||
</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"> | <div class="paragraph"> | ||||
<p>All message parameters are REQUIRED. All messages MUST be sent from the same socket as the <code>announce</code> | <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 | 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 | <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> | is lacking a robust TCP implementation at the time of writing, but in the future it may be useful.</p> | ||||
</div> | </div> | ||||
<div class="sect2"> | |||||
<h3 id="_establishing_a_connection">2.1. Establishing a Connection</h3> | |||||
<div class="sect3"> | <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"> | <div class="paragraph"> | ||||
<p>At launch, the client MUST check the environment for the value of <code>NSM_URL</code>. If present, the client | <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 | 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> | </tbody> | ||||
</table> | </table> | ||||
</div> | </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"> | <div class="paragraph"> | ||||
<p>The server will respond to the client’s announce message with the following message:</p> | <p>The server will respond to the client’s announce message with the following message:</p> | ||||
</div> | </div> | ||||
@@ -757,8 +832,8 @@ For example, the Non applications activate their "SM" blinkers at this time.</p> | |||||
</table> | </table> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>Compliant clients MUST accept the client control messages described in this section. All client | <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 | 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> | <pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/error s:path i:error_code s:message</code></pre> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>There is no message for this. Clients will receive the Unix SIGTERM signal and MUST close cleanly | <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 | 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> | soon after having responded to a <code>save</code> message.</p> | ||||
</div> | </div> | ||||
</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="listingblock"> | ||||
<div class="content"> | <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> | <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 | <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> | indicated by sending messages to <code>/nsm/client/progress</code>.</p> | ||||
</div> | </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"> | <div class="paragraph"> | ||||
<p>The client MUST respond to the 'open' message with:</p> | <p>The client MUST respond to the 'open' message with:</p> | ||||
</div> | </div> | ||||
@@ -917,8 +992,8 @@ indicated by sending messages to <code>/nsm/client/progress</code>.</p> | |||||
</table> | </table> | ||||
</div> | </div> | ||||
</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="listingblock"> | ||||
<div class="content"> | <div class="content"> | ||||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/save</code></pre> | <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 | <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> | times within the course of a session (including zero, if the user aborts the session).</p> | ||||
</div> | </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="listingblock"> | ||||
<div class="content"> | <div class="content"> | ||||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/reply "/nsm/client/save" s:message</code></pre> | <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> | ||||
</div> | </div> | ||||
<div class="sect2"> | |||||
<h3 id="_server_to_client_informational_messages">2.3. Server to Client Informational Messages</h3> | |||||
<div class="sect3"> | <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"> | <div class="paragraph"> | ||||
<p>Accepting this message is optional. The intent is to signal to clients which may have some | <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 | 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> | <p>This message does not require a response.</p> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>If the client has specified the <code>optional-gui</code> capability, then it may receive this message from the | <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’t matter if the | server when the user wishes to change the visibility state of the GUI. It doesn’t matter if the | ||||
@@ -1017,10 +1092,10 @@ separate program, it should be killed.</p> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="sect2"> | |||||
<h3 id="_client_to_server_informational_messages">2.4. Client to Server Informational Messages</h3> | |||||
<div class="sect3"> | <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"> | <div class="paragraph"> | ||||
<p>If the client has specified the <code>optional-gui</code> capability, then it MUST send this message whenever | <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’s | the state of visibility of the optional GUI has changed. It also MUST send this message after it’s | ||||
@@ -1044,8 +1119,8 @@ loads.</p> | |||||
<p>No response will be delivered.</p> | <p>No response will be delivered.</p> | ||||
</div> | </div> | ||||
</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="listingblock"> | ||||
<div class="content"> | <div class="content"> | ||||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/progress f:progress</code></pre> | <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> | capability string.</p> | ||||
</div> | </div> | ||||
</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="listingblock"> | ||||
<div class="content"> | <div class="content"> | ||||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/is_dirty</code></pre> | <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> | <p>Clients which have this capability should include <code>:dirty:</code> in their <code>announce</code> capability string.</p> | ||||
</div> | </div> | ||||
</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="listingblock"> | ||||
<div class="content"> | <div class="content"> | ||||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/message i:priority s:message</code></pre> | <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> | ||||
</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"> | <table class="tableblock frame-all grid-all stripes-even stretch"> | ||||
<caption class="title">Table 6. Error Code Definitions</caption> | <caption class="title">Table 6. Error Code Definitions</caption> | ||||
<colgroup> | <colgroup> | ||||
@@ -1164,8 +1239,8 @@ string.</p> | |||||
</tbody> | </tbody> | ||||
</table> | </table> | ||||
</div> | </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"> | <div class="paragraph"> | ||||
<p>If the server publishes the <code>:server_control:</code> capability, then clients can also initiate action by | <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 | 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> | management interface to effect the save.</p> | ||||
</div> | </div> | ||||
</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"> | <div class="paragraph"> | ||||
<p>The session manager not only manages clients via OSC, but it is itself controlled via OSC messages. | <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> | The server responds to the following messages.</p> | ||||
@@ -1330,8 +1405,8 @@ error.</p> | |||||
</li> | </li> | ||||
</ul> | </ul> | ||||
</div> | </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"> | <div class="paragraph"> | ||||
<p>If the server includes <code>:broadcast:</code> in its capability string, then clients may send broadcast | <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 | 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> | </div> | ||||
</div> | |||||
<div id="footer"> | <div id="footer"> | ||||
<div id="footer-text"> | <div id="footer-text"> | ||||
Version 1.2<br> | Version 1.2<br> | ||||
Last updated 2020-07-06 18:12:58 +0200 | |||||
Last updated 2020-07-06 22:15:39 +0200 | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</body> | </body> |
@@ -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’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’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> |
@@ -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. | |||||
@@ -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/ | https://asciidoctor.org/docs/user-manual/ | ||||
//// | //// | ||||
//// | //// | ||||
This documentation is licensed under the Creative Commons Attribution-ShareAlike 2.5 International License. | 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 | 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 | :authors: Jonathan Moore Liles | ||||
:email: <male@tuxfamily.org> | :email: <male@tuxfamily.org> | ||||
:revnumber: 1.2 | :revnumber: 1.2 | ||||
:revdate: 2013-04-06 | |||||
:iconfont-remote!: | :iconfont-remote!: | ||||
:!webfonts: | :!webfonts: | ||||
@@ -22,15 +22,12 @@ A copy of the license has been provided in the file documentation/API/LICENSE. | |||||
:sectnums: | :sectnums: | ||||
:sectnumlevels: 4 | :sectnumlevels: 4 | ||||
:toc: preamble | |||||
:toc: | |||||
:toc-title: Table of Contents | :toc-title: Table of Contents | ||||
:toclevels: 4 | :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 | 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 | 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. | 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 | Most graphical applications make available to the user a common set of file operations, typically | ||||
presented under a File or Project menu. | 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. | to these guidelines. | ||||
==== File Menu | |||||
=== File Menu | |||||
===== New | |||||
==== New | |||||
This option may empty/reset the current file or project (possibly after user confirmation). UNDER | 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. | NO CIRCUMSTANCES should it allow the user to create a new project/file in another location. | ||||
===== Open | |||||
==== Open | |||||
This option MUST be disabled. | 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. | 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 | This option should behave as normal, saving the current file/project as established by the NSM | ||||
`open` message. | `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. | 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. | 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. | 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 | This option MUST be disabled unless its meaning is to disconnect the application from session | ||||
management. | management. | ||||
===== Quit or Exit | |||||
==== Quit or Exit | |||||
This option may behave as normal (possibly asking the user to confirm exiting). | 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 | 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 | 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). | specifies). | ||||
===== External Files | |||||
==== External Files | |||||
Files required by the project but external to it (typically read-only data such as audio samples) | 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 | 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` | 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 | 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. | 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 | 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 | 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: | 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 | 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 | 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 | 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 | 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. | soon after having responded to a `save` message. | ||||
===== Open | |||||
==== Open | |||||
[source%nowrap,OSC] | [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`. | indicated by sending messages to `/nsm/client/progress`. | ||||
====== Response | |||||
===== Response | |||||
The client MUST respond to the 'open' message with: | The client MUST respond to the 'open' message with: | ||||
@@ -381,7 +378,7 @@ Or | |||||
|=== | |=== | ||||
===== Save | |||||
==== Save | |||||
[source%nowrap,OSC] | [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 | 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). | times within the course of a session (including zero, if the user aborts the session). | ||||
====== Response | |||||
===== Response | |||||
[source%nowrap,OSC] | [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 | 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 | 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. | 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 | 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 | 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 | 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 | 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. | No response will be delivered. | ||||
===== Progress | |||||
==== Progress | |||||
[source%nowrap,OSC] | [source%nowrap,OSC] | ||||
---- | ---- | ||||
@@ -503,7 +500,7 @@ Clients which intend to send progress messages should include `:progress:` in th | |||||
capability string. | capability string. | ||||
===== Dirtiness | |||||
==== Dirtiness | |||||
[source%nowrap,OSC] | [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. | Clients which have this capability should include `:dirty:` in their `announce` capability string. | ||||
===== Status Messsages | |||||
==== Status Messsages | |||||
[source%nowrap,OSC] | [source%nowrap,OSC] | ||||
---- | ---- | ||||
@@ -535,7 +532,7 @@ Clients which have this capability should include `:message:` in their `announce | |||||
string. | string. | ||||
==== Error Code Definitions | |||||
=== Error Code Definitions | |||||
.Error Code Definitions | .Error Code Definitions | ||||
[options="header", stripes=even] | [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 | 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 | 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. | 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 session manager not only manages clients via OSC, but it is itself controlled via OSC messages. | ||||
The server responds to the following 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 | 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 | messages to each other through the NSM server. Clients may send messages to the server at the path |
@@ -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 |
@@ -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[] |
@@ -0,0 +1 @@ | |||||
# New Session Manager |
@@ -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. |
@@ -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.). |
@@ -0,0 +1,7 @@ | |||||
Hallo Welt | |||||
Lol Rolf | |||||
== Cool Cool | |||||
Cool |
@@ -17,7 +17,7 @@ | |||||
# along with New-Session-Manager. If not, see <https://www.gnu.org/licenses/>. | # 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 | #Dependencies | ||||