aboutsummaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/info/mds.texinfo1061
1 files changed, 505 insertions, 556 deletions
diff --git a/doc/info/mds.texinfo b/doc/info/mds.texinfo
index bf26a32..caf880f 100644
--- a/doc/info/mds.texinfo
+++ b/doc/info/mds.texinfo
@@ -264,65 +264,73 @@ libraries and concepts.
@node Overview
@chapter Overview
-@command{mds}@footnote{mds stands for micro-display server.}
-is a display server protocol and an implementation of said
-protocol. What makes @command{mds} stand out is its core
-design choice: it is desigend just like a microkernel.
-Rather than one, possibly modular, process --- a monolithic
-process --- @code{mds} is comprised of many small servers,
-each exchangable and responsible for one thing.
+@command{mds}@footnote{mds stands for micro-display
+server.} is a display server protocol and an
+implementation of said protocol. What makes
+@command{mds} stand out is its core design choice:
+it is desigend just like a microkernel. Rather than
+one, possibly modular, process --- a monolithic
+process --- @code{mds} is comprised of many small
+servers, each exchangable and responsible for one
+thing.
@cpindex Goals of @command{mds}
-@command{mds}'s goal is neither security, performance nor
-a perfect graphical experience. @command{mds} is all
-about flexibility and freedom 0@footnote{The freedom to run
-the program as you wish, for any purpose.}.
-
-The reason for having a display server architectured as a
-microkernel is so that components can be added, removed,
-updated and replaced online. Additionally, the message passing
-between the servers makes it easy to design a system that
-lets you make clients that can listen on messages between
-the servers and perhaps modify them. This enables you to
-do so much more with your display server. Moreover, if
-a single part of the system crashes it does not bring down
-the whole system, and the crashed server can be respawned
-with minor side effects. @command{mds} is architectured
-in three layers: a microkernel, a master server and a
-collection of servers. And clients are actually located
-on the same layer as the servers, because there is no
-actual difference, the only thing that separates a server
-from a client is for what purpose you run it. @command{mds}'s
-kernel is a minimal program that do initialisation of the
-display, such as giving it an index and create runtime
-files and directories for servers and other programs
-to use. Then the kernel creates a domain socket for the
-master server and spawns the master server and respawns
-it if it crashes. Because of this, if the master server
-crashes it will not lose its socket when it is respawned.
-The master server then, on its initial spawn, starts
-the all servers and other programs that the user have
-choosen and then starts accepting connections to it and
-coordinates messages between servers and clients. Further,
-separating all components into separate processes enables
-us to only give the servers the privileges they actually
-need, rather than having one program with root privileges
-that takes care of everything even things that do not do
-require any privileges.
-
-All @command{mds}'s servers, that is all running parts of
-@command{mds} except the kernel, are designed so that they
-can re-execute themself so that they can be updated online
-without any side effects. Servers serialises their state,
-saves it to RAM (in a directory created by the kernel),
-re-execute themself and loads their serialised state. The
-kernel cannot do this because when it has spawned the
-master server it has no reason to re-execute, its only mission
-is to respawn the master server it if would happen to crash.
-It would technically be possible to enable the kernel to
-re-execute but it is not worth it as there is no reason to
-re-execute, and doing so puts the display server at risk
-of crashing.
+@command{mds}'s goal is neither security, performance
+nor a perfect graphical experience. @command{mds} is
+all about flexibility and freedom 0@footnote{The
+freedom to run the program as you wish, for any
+purpose.}.
+
+The reason for having a display server architectured
+as a microkernel is so that components can be added,
+removed, updated and replaced online. Additionally,
+the message passing between the servers makes it easy
+to design a system that lets you make clients that
+can listen on messages between the servers and
+perhaps modify them. This enables you to do so much
+more with your display server. Moreover, if a single
+part of the system crashes it does not bring down the
+whole system, and the crashed server can be respawned
+with minor side effects. @command{mds} is
+architectured in three layers: a microkernel, a
+master server and a collection of servers. And
+clients are actually located on the same layer as the
+servers, because there is no actual difference, the
+only thing that separates a server from a client is
+for what purpose you run it. @command{mds}'s kernel
+is a minimal program that do initialisation of the
+display, such as giving it an index and create
+runtime files and directories for servers and other
+programs to use. Then the kernel creates a domain
+socket for the master server and spawns the master
+server and respawns it if it crashes. Because of
+this, if the master server crashes it will not lose
+its socket when it is respawned. The master server
+then, on its initial spawn, starts the all servers
+and other programs that the user have choosen and
+then starts accepting connections to it and
+coordinates messages between servers and clients.
+Further, separating all components into separate
+processes enables us to only give the servers the
+privileges they actually need, rather than having
+one program with root privileges that takes care of
+everything even things that do not do require any
+privileges.
+
+All @command{mds}'s servers, that is all running
+parts of @command{mds} except the kernel, are
+designed so that they can re-execute themself so that
+they can be updated online without any side effects.
+Servers serialises their state, saves it to RAM (in a
+directory created by the kernel), re-execute themself
+and loads their serialised state. The kernel cannot
+do this because when it has spawned the master server
+it has no reason to re-execute, its only mission is
+to respawn the master server it if would happen to
+crash. It would technically be possible to enable the
+kernel to re-execute but it is not worth it as there
+is no reason to re-execute, and doing so puts the
+display server at risk of crashing.
@@ -349,18 +357,18 @@ of crashing.
The @command{mds} display server in architectured in
three layers. The first layer is called the kernel.
The kernel is responsible for acquiring a display
-server index@footnote{As with any display server,
-the system can have multiple instances of
-@command{mds} running at the same time.}, set up
-environment variables to indicate which display
-server and display server instance is being used,
-create a domain socket for the display server and
-start the master server and restart it if it crashes,
-and then clean up the system when the display server
-closes. The kernel only responsible for creating
-the domain socket for communication with the display
-server, it is not responsible for using it, that
-mission falls to the master server.
+server index@footnote{As with any display server, the
+system can have multiple instances of @command{mds}
+running at the same time.}, set up environment
+variables to indicate which display server and
+display server instance is being used, create a
+domain socket for the display server and start the
+master server and restart it if it crashes, and then
+clean up the system when the display server closes.
+The kernel only responsible for creating the domain
+socket for communication with the display server, it
+is not responsible for using it, that mission falls
+to the master server.
@cpindex Master server
@cpindex Message passing, coordination
@@ -372,22 +380,22 @@ server has two responsibilities: coordinating
message passing between other servers and clients
@footnote{In @command{mds} there is no functional
distinction between servers and clients, the
-distinction is purely semantic.} and starting
-other servers.
+distinction is purely semantic.} and starting other
+servers.
@cpindex Starting of servers
@cpindex Servers, starting
@pgindex @file{mdsinitrc}
The third layer is the other servers and clients.
-protocolwise there is no specification on how
-they are started. But in the reference
-implementation of the master server, this is
-done by starting a shell script with the
-pathname @file{$@{XDG_CONFIG_HOME@}/mdsinitrc}
-and the user is responsible for providing the
-logic in that shell script.@footnote{Moonstruck
-users are allowed to implement this in C
-or any other language of their choosing.}
+protocolwise there is no specification on how they
+are started. But in the reference implementation of
+the master server, this is done by starting a shell
+script with the pathname
+@file{$@{XDG_CONFIG_HOME@}/mdsinitrc} and the user
+is responsible for providing the logic in that shell
+script.@footnote{Moonstruck users are allowed to
+implement this in C or any other language of their
+choosing.}
@c Which is better: cray-cray users, lunatic users,
@c moonstruck users, insane users, ballers, madmen,
@c loony tunes, systemd-lovers?
@@ -404,21 +412,18 @@ of the display server.
@cpindex Interprocess communication, mechanism
@cpindex Master server
@pgindex @command{mds-server}
-Intrinsic to @command{mds} is a powerful
-interprocess communication mechanism. Servers
-and clients connect to the display server by
-connecting to a domain socket served by the
-master server. A server or client that has
-connected to the display server can do three
-things:
+Intrinsic to @command{mds} is a powerful interprocess
+communication mechanism. Servers and clients connect
+to the display server by connecting to a domain
+socket served by the master server. A server or
+client that has connected to the display server can
+do three things:
@itemize
@item
Request assignment of a unique ID@.
-
@item
Multicast a message.
-
@item
Join or leave a multicast group.
@end itemize
@@ -430,15 +435,14 @@ Join or leave a multicast group.
@cpindex Disconnection
@cpindex Master server
@pgindex @command{mds-server}
-Upon assignment of an ID the master server
-will automatically place the client in a
-multicast group for that specific client.
-This automatically multicast group assignment
-is done by the master server simply so you
-as a debugger do not forget to do so. When
-a client is disconnected it will send out a
-message to a specific multicast group that
-the client, refered to by it's ID, have closed.
+Upon assignment of an ID the master server will
+automatically place the client in a multicast group
+for that specific client. This automatically
+multicast group assignment is done by the master
+server simply so you as a debugger do not forget to
+do so. When a client is disconnected it will send
+out a message to a specific multicast group that the
+client, refered to by it's ID, have closed.
@cpindex Message passing, message structure
@cpindex Communication, message structure
@@ -446,16 +450,16 @@ the client, refered to by it's ID, have closed.
@cpindex Message structure, message passing
@cpindex Master server
@pgindex @command{mds-server}
-A message in the @command{mds} protocol is
-comprised of two parts: headers and a payload.
-When a client joins a multicast group it is
-actually saying that it is interested in
-receiving broadcasts containing a specific header
-or a specific header--value pair, or that it
-is interesting in all messages@footnote{This
-could be used for logging, possibly spying and
-networking.}. Thus a message is automatically
-multicasted to groups indicated by its headers.
+A message in the @command{mds} protocol is comprised
+of two parts: headers and a payload. When a client
+joins a multicast group it is actually saying that
+it is interested in receiving broadcasts containing
+a specific header or a specific header--value pair,
+or that it is interesting in all messages
+@footnote{This could be used for logging, possibly
+spying and networking.}. Thus a message is
+automatically multicasted to groups indicated by its
+headers.
@cpindex Interceptions, message passing
@cpindex Message passing, message modification
@@ -465,47 +469,41 @@ multicasted to groups indicated by its headers.
@cpindex Master server
@pgindex @command{mds-server}
@cpindex Multicast groups
-The multicast groups and receiving of message
-is called interceptions. The interesting
-property of interceptions is that they may
-be modifying. When a server registers for
-message interception it can say that it wants
-to be able to modify messages. If this is done
-and the server receives a message for which it
-has said it want to be able to modify it,
-the master server will wait for that server
-to respond before it send the message to
-the next server in the interception list.
-The server can choose to do three things
-with a message that it has opted in for
-modification of: leave the message as-is,
-modify the message, or consume the message.
-A message consumption is done by modify
-the message to make it empty. A consumed
-message will not be send to any further
-clients or servers in the interception list.
+The multicast groups and receiving of message is
+called interceptions. The interesting property of
+interceptions is that they may be modifying. When a
+server registers for message interception it can say
+that it wants to be able to modify messages. If this
+is done and the server receives a message for which
+it has said it want to be able to modify it, the
+master server will wait for that server to respond
+before it send the message to the next server in the
+interception list. The server can choose to do three
+things with a message that it has opted in for
+modification of: leave the message as-is, modify the
+message, or consume the message. A message
+consumption is done by modify the message to make it
+empty. A consumed message will not be send to any
+further clients or servers in the interception list.
@cpindex Interception priority, message passing
@cpindex Priority, interception, message passing
@cpindex Message consumption, message passing
@cpindex Consumption, interception, message passing
-To make this mechanism sensible, a server or
-client can set a priority when it registers
-for interception (does not need to be
-modifying.) When a message is broadcasted it
-will be received by all servers in the
-interception except the original sender,
-unless it gets consumes. The order in which
-the master server sends the message to the
-recipients is determined by priority the
-servers registed with. The message first sent
-to the recipients with highest priority and
-last to the recipients with lowest priority,
-and ordered by the priority between those
-priorities. Of two or more servers have the
-same priority the order in which they will
-receive the message, of those recipients,
-is arbitrary.
+To make this mechanism sensible, a server or client
+can set a priority when it registers for interception
+(does not need to be modifying.) When a message is
+broadcasted it will be received by all servers in the
+interception except the original sender, unless it
+gets consumes. The order in which the master server
+sends the message to the recipients is determined by
+priority the servers registed with. The message first
+sent to the recipients with highest priority and last
+to the recipients with lowest priority, and ordered
+by the priority between those priorities. Of two or
+more servers have the same priority the order in
+which they will receive the message, of those
+recipients, is arbitrary.
@pgindex @command{mds-vt}
@cpindex Virtual terminal, switching
@@ -515,33 +513,29 @@ is arbitrary.
@cpindex Communication, dual-connection
@cpindex Interprocess communication, dual-connection
@cpindex Reflexive connection, message passing
-An interesting property of this mechanism
-is demonstrated in the @command{mds-vt}
-server. Unlike most servers @command{mds-vt}
-maintains two concurrent connections to
-the display. Once @command{mds-vt} receives
-a signal from the OS kernel requesting to
-switch virtual terminal, @command{mds-vt}
-will from one of its connections send
-out a message and wait for it to be
-received in its other connection and the
-let the OS kernel switch virtual terminal.
-The secondary connection to the display
-has registered interception with lower
-priority of the message than the primary
-connection broadcasts. This message will
-be received by other servers that will
-let the message continue to the next
-server in the interception list once that
-server is ready for the OS kernel to switch
-virtual terminal. All of these servers have
-registered modifying interception of the
-message but none of them will actually modify
-or consume the message; it is only used a
-mechanism for letting @command{mds-vt} know
-when all servers are ready for the switch
-without having to know how many they are
-and wait for a reply from all of them.
+An interesting property of this mechanism is
+demonstrated in the @command{mds-vt} server. Unlike
+most servers @command{mds-vt} maintains two
+concurrent connections to the display. Once
+@command{mds-vt} receives a signal from the OS
+kernel requesting to switch virtual terminal,
+@command{mds-vt} will from one of its connections
+send out a message and wait for it to be received
+in its other connection and the let the OS kernel
+switch virtual terminal. The secondary connection to
+the display has registered interception with lower
+priority of the message than the primary connection
+broadcasts. This message will be received by other
+servers that will let the message continue to the
+next server in the interception list once that server
+is ready for the OS kernel to switch virtual
+terminal. All of these servers have registered
+modifying interception of the message but none of
+them will actually modify or consume the message; it
+is only used a mechanism for letting @command{mds-vt}
+know when all servers are ready for the switch
+without having to know how many they are and wait
+for a reply from all of them.
@@ -560,18 +554,18 @@ there are some guildlines you should follow.
@cpindex Client-side decoration
@cpindex Server-side decoration
@cpindex Decoration, guildlines
-@b{Do not create client-side decoration}. Some
-users do not want decorations or wants minimal
-decorations. Windows should look similar, server-side
-decoration helps ensure this. Your client-side
-decorations may not meet the requirements the users
-have. For example, your client-side decoration may
-only support minimise, maximise and close, whilst the
-user may also want, as provided by her decoration
-server, stick, shade and always on top. And it should
-be sufficient to configure your decorations once
-rather once for every toolkit. Additionally, because
-of oversight from developers, client-side decoration
+@b{Do not create client-side decoration}. Some users
+do not want decorations or wants minimal decorations.
+Windows should look similar, server-side decoration
+helps ensure this. Your client-side decorations may
+not meet the requirements the users have. For
+example, your client-side decoration may only support
+minimise, maximise and close, whilst the user may
+also want, as provided by her decoration server,
+stick, shade and always on top. And it should be
+sufficient to configure your decorations once rather
+once for every toolkit. Additionally, because of
+oversight from developers, client-side decoration
tends to work poorly with tiling window managers.
@item
@@ -582,12 +576,11 @@ tends to work poorly with tiling window managers.
@b{Do not remember size and position}. Some users
do not want their programs to remember their size
and position. There is also a risk that your
-mechanism for implementing this does not account
-for the possibility that outputs may have been
-removed, resized or relocated.
-@command{mds-posmem} can be used if the user wants
-programs to start where they were closed the last
-time they were closed.
+mechanism for implementing this does not account for
+the possibility that outputs may have been removed,
+resized or relocated. @command{mds-posmem} can be
+used if the user wants programs to start where they
+were closed the last time they were closed.
@end itemize
@@ -645,16 +638,15 @@ servers collectively.
@cpindex Version update
@sgindex @code{SIGUSR1}
@sgindex @code{SIGUPDATE}
-@command{mds} servers can re-execute into an
-updated version of their binary. This can be
-used to update display server online after
-a new version has been installed. To do this
-send the signal @code{SIGUSR1} to the server
-you want update. If a server does not support
-online updating it will ignore this signal.
+@command{mds} servers can re-execute into an updated
+version of their binary. This can be used to update
+display server online after a new version has been
+installed. To do this send the signal @code{SIGUSR1}
+to the server you want update. If a server does not
+support online updating it will ignore this signal.
If the operating system defines a signal named
-@code{SIGUPDATE}, this signal is used
-instead of @code{SIGUSR1}.
+@code{SIGUPDATE}, this signal is used instead of
+@code{SIGUSR1}.
@cpindex Signals
@cpindex Memory release, automatic
@@ -664,11 +656,10 @@ instead of @code{SIGUSR1}.
@cpindex Releasing memory
@sgindex @code{SIGDANGER}
@sgindex @code{SIGRTMIN + 1}
-If you need servers to free up allocated
-memory that they do not use, send the signal
-@code{SIGDANGER}, or if not defined
-@code{SIGRTMIN + 1}. Unimportant servers
-may choose to die on @code{SIGDANGER}@.
+If you need servers to free up allocated memory that
+they do not use, send the signal @code{SIGDANGER}, or
+if not defined @code{SIGRTMIN + 1}. Unimportant
+servers may choose to die on @code{SIGDANGER}@.
@sgindex @code{SIGINFO}
@sgindex @code{SIGRTMIN + 2}
@@ -676,29 +667,27 @@ may choose to die on @code{SIGDANGER}@.
@cpindex Statistics dump
Server may also choose to support the signal
@code{SIGINFO}, or if not defined
-@code{SIGRTMIN + 2}. It is not expected
-that server do support this signal, but
-thay must not die when received. @code{SIGINFO}
-is send by a user to the server, if she wants
-the server to dump information about the
-server's state or statistics to the TTY@.
+@code{SIGRTMIN + 2}. It is not expected that server
+do support this signal, but thay must not die when
+received. @code{SIGINFO} is send by a user to the
+server, if she wants the server to dump information
+about the server's state or statistics to the TTY@.
@sgindex @code{SIGRTMIN}
@cpindex No-operation signal
-All servers configured to be interrupted
-when the signal @code{SIGRTMIN} is received.
-No further action is taked. This may be used
-by the user to test that the program supports
-being interrupted. It can also be used by
-the server to interrupt itself from another
+All servers configured to be interrupted when the
+signal @code{SIGRTMIN} is received. No further action
+is taked. This may be used by the user to test that
+the program supports being interrupted. It can also
+be used by the server to interrupt itself from another
thread.
@pgindex @command{valgrind}
@sgindex @code{SIGRTMAX}
-@command{valgrind} uses @code{SIGRTMAX} for
-its own internal stuff. Therefore servers must
-not use @code{SIGRTMAX} as it is hence
-unavailable when running under @command{valgrind}.
+@command{valgrind} uses @code{SIGRTMAX} for its own
+internal stuff. Therefore servers must not use
+@code{SIGRTMAX} as it is hence unavailable when
+running under @command{valgrind}.
@@ -710,23 +699,23 @@ unavailable when running under @command{valgrind}.
@cpindex Kernel
@cpindex Display server kernel
@pgindex @command{mds}
-The @command{mds} kernel creates two directories
-for the @command{mds} servers to use: one for
-runtime data and one for temporary data.
-These directories are named by
-@code{MDS_RUNTIME_ROOT_DIRECTORY} and
+The @command{mds} kernel creates two directories for
+the @command{mds} servers to use: one for runtime
+data and one for temporary data. These directories
+are named by @code{MDS_RUNTIME_ROOT_DIRECTORY} and
@code{MDS_STORAGE_ROOT_DIRECTORY}, respectively,
by the header file @file{<libmdsserver/config.h>}.
If the systems runtime data directory is @file{/run}
and transient temporary data directory is @file{/tmp},
-and the package name of @command{mds} is @command{mds},
-these directories will be @file{/run/mds} and
+and the package name of @command{mds} is
+@command{mds}, these directories will be
+@file{/run/mds} and
@file{/tmp/.@{system-directory@}.mds}, respectively.
In @file{/tmp/.@{system-directory@}.mds} the kernel
-will create a directory for the display server instance
-named @file{.data} prefixed by the display server index.
-For example if the display server index is zero,
-temporary data may be stored in
+will create a directory for the display server
+instance named @file{.data} prefixed by the display
+server index. For example if the display server index
+is zero, temporary data may be stored in
@file{/tmp/.@{system-directory@}.mds/0.data}
@cpindex Re-executing servers
@@ -742,24 +731,22 @@ the POSIX shared memory unit named
functions for the data type @code{intmax_t}.} is
replaced with the process ID of the server. This
file will be bound to the pathname
-@file{/dev/shm/.proc-pid-%ji} if POSIX shared
-memory is stored in @file{/dev/shm} by the
-operating system.
+@file{/dev/shm/.proc-pid-%ji} if POSIX shared memory
+is stored in @file{/dev/shm} by the operating system.
-In @code{MDS_RUNTIME_ROOT_DIRECTORY} the kernel
-will create two files. @file{.pid} and @file{.socket},
+In @code{MDS_RUNTIME_ROOT_DIRECTORY} the kernel will
+create two files. @file{.pid} and @file{.socket},
both prefixed with the display server index
-@footnote{@file{0.pid} and @file{0.socket} if
-the display server index is 0.}. The @file{.pid}
-file contains the process ID of the display server
-and is used by the kernel to figure out whether
-an display server index is still in use or just
-not properly cleaned up. Of course it can be used
-by any program to find the process ID of the
-kernel process of a display server instance.
-The @file{.socket} is the domain socket used
-for communication with the display server and
-its servers and clients.
+@footnote{@file{0.pid} and @file{0.socket} if the
+display server index is 0.}. The @file{.pid} file
+contains the process ID of the display server and is
+used by the kernel to figure out whether an display
+server index is still in use or just not properly
+cleaned up. Of course it can be used by any program
+to find the process ID of the kernel process of a
+display server instance. The @file{.socket} is the
+domain socket used for communication with the display
+server and its servers and clients.
@@ -773,12 +760,11 @@ its servers and clients.
@cpindex Display server kernel
@pgindex @command{mds}
Message passing over domain sockets is the
-underlaying technique for communicating with
-the display server. To communicate with the
-display server in the local machine a process
-must connect to the domain socket created by
-the display server kernel as named in
-@ref{Filesystem}.
+underlaying technique for communicating with the
+display server. To communicate with the display
+server in the local machine a process must connect
+to the domain socket created by the display server
+kernel as named in @ref{Filesystem}.
@cpindex Connecting to the display
@cpindex Client ID assignment
@@ -800,32 +786,27 @@ Message ID: 0\n
@cpindex Message ID
@cpindex Message corruption
@cpindex Corrupt messages
-where @code{\n} is an LF-line break.
-The value on the @code{Message ID} line
-does not need to be 0, but servers and
-clients often start with 0 and count
-upwards. The value is however bound to
-an unsigned 32-bit integer. All message
-must contain this @code{Message ID} header,
-otherwise the message is considered corrupt
-and is ignored.
+where @code{\n} is an LF-line break. The value on the
+@code{Message ID} line does not need to be 0, but
+servers and clients often start with 0 and count
+upwards. The value is however bound to an unsigned
+32-bit integer. All message must contain this
+@code{Message ID} header, otherwise the message is
+considered corrupt and is ignored.
@cpindex Message structure
@cpindex Message passing, message structure
@cpindex Communication, message structure
@cpindex Interprocess communication, message structure
-The empty line signifies the end of the
-header list, and in this case the end of
-the message. But a message may contain
-payload beneath this empty line. To
-include a payload, add the header
-@code{Length} that says how many bytes
-the payload is comprised.
-
-A header must contain a header name and
-header value without any trailing or
-leading spaces, and `: ' (colon, one
-regular blank space) exactly delimits
+The empty line signifies the end of the header list,
+and in this case the end of the message. But a
+message may contain payload beneath this empty line.
+To include a payload, add the header @code{Length}
+that says how many bytes the payload is comprised.
+
+A header must contain a header name and header value
+without any trailing or leading spaces, and `: '
+(colon, one regular blank space) exactly delimits
the name and the value.
@cpindex Master server
@@ -834,22 +815,18 @@ the name and the value.
@cpindex ID assignment
@cpindex Assignment of ID
When the master server receives this
-@code{Command: assign-id} message it
-will assign the client a unique ID
-and send it to the client.@footnote{The
-master server is the only server than
-can address the client uniquely before
-it has an ID, so this part can only
-be implement in the master server.}
-If the client already has an ID, it
-will send back that ID to the client.
-This response consists of two headers
-@code{ID assignment} and @code{In
-response to}, containing the client's
-new (or possibly already assigned) ID
-and the value that was in the
-@code{Message ID} header, respectively.
-For example:
+@code{Command: assign-id} message it will assign the
+client a unique ID and send it to the
+client.@footnote{The master server is the only server
+than can address the client uniquely before it has an
+ID, so this part can only be implement in the master
+server.} If the client already has an ID, it will
+send back that ID to the client. This response
+consists of two headers @code{ID assignment} and
+@code{In response to}, containing the client's
+new (or possibly already assigned) ID and the value
+that was in the @code{Message ID} header,
+respectively. For example:
@example
@group
@@ -860,29 +837,24 @@ In response to: 0\n
@end example
@cpindex Message ID
-Notice that the master server never
-includes @code{Message ID} in message
-originating from it.
-
-As seen in this example, the client ID
-consists of two integers delimited by
-a colon (`:'). Both of these integers
-are unsigned 32-bit integers. This is
-done this way because unsigned 64-bit
-integers are forbidden because it is
-not supported natively be some
-programming languages.
-
-Before a client has gotten a unique client
-ID assigned to it, it will be `0:0'.
+Notice that the master server never includes
+@code{Message ID} in message originating from it.
+
+As seen in this example, the client ID consists of
+two integers delimited by a colon (`:'). Both of
+these integers are unsigned 32-bit integers. This is
+done this way because unsigned 64-bit integers are
+forbidden because it is not supported natively be
+some programming languages.
+
+Before a client has gotten a unique client ID
+assigned to it, it will be `0:0'.
@cpindex Disconnection
-If a client gets disconnected from the
-master server, the master server will
-sends out a signal header message.
-This header will be @code{Client closed}
-and contain ID of the client that closed.
-For example:
+If a client gets disconnected from the master server,
+the master server will sends out a signal header
+message. This header will be @code{Client closed}
+and contain ID of the client that closed. For example:
@example
@group
@@ -891,9 +863,8 @@ Client closed: 0:1\n
@end group
@end example
-Be aware that if a server or client
-closes and does not have a unique client
-ID, this message will be:
+Be aware that if a server or client closes and does
+not have a unique client ID, this message will be:
@example
@group
@@ -906,21 +877,17 @@ Client closed: 0:0\n
@cpindex Message passing, addressing
@cpindex Communication, addressing
@cpindex Interprocess communication, addressing
-Once a client has an unique client ID
-assigned to it, it should always include
-the header @code{Client ID} in its
-messages. The value of @code{Client ID}
-should be the client's ID@. If a server
-wants to address this client, it should
-include the header @code{To} with the
-value set to the recipient's client ID@.
-Be aware that such message may not be
-sent to that recipient uniquely, any
-server or client is free to sign up
-for receive of such message, any messages
-or message contain any other header or
-header--value pair that may also be
-included in the header.
+Once a client has an unique client ID assigned to it,
+it should always include the header @code{Client ID}
+in its messages. The value of @code{Client ID} should
+be the client's ID@. If a server wants to address
+this client, it should include the header @code{To}
+with the value set to the recipient's client ID@.
+Be aware that such message may not be sent to that
+recipient uniquely, any server or client is free to
+sign up for receive of such message, any messages
+or message contain any other header or header--value
+pair that may also be included in the header.
@@ -939,28 +906,24 @@ included in the header.
@cpindex Eavesdropping, message passing
As discussed in @ref{Interprocess Communication},
interception in the primary feature of
-@command{mds}'s message passing system.
-Not only does it enable servers to select
-which message it wants to receive in order
-to provide it's service. It also enables
-clients to do anything, things that was
-never anticipated. As an example of its
-power, @command{mds} does not provide any
-protocol for taking screenshots or recording
-a session. Instead, a screenshot application
-signs up for messages passed between the
-compositor and presentation servers, and
-simply requests that the compositor resends
-the screen, a feature intended for the
-presentation servers. A screen recoding
-application would do the same and just
-hang on and record all message passed
+@command{mds}'s message passing system. Not only does
+it enable servers to select which message it wants to
+receive in order to provide it's service. It also
+enables clients to do anything, things that was never
+anticipated. As an example of its power,
+@command{mds} does not provide any protocol for
+taking screenshots or recording a session. Instead,
+a screenshot application signs up for messages passed
+between the compositor and presentation servers, and
+simply requests that the compositor resends the
+screen, a feature intended for the presentation
+servers. A screen recoding application would do the
+same and just hang on and record all message passed
between the servers.
-If you want your server or client to
-receive all messages passed around in
-the display server, simply sign up for
-all messages:
+If you want your server or client to receive all
+messages passed around in the display server, simply
+sign up for all messages:
@example
@group
@@ -970,9 +933,9 @@ Message ID: 0\n
@end group
@end example
-But if you only want messages contain
-the header @code{Command}, include
-that header in the payload of the message:
+But if you only want messages contain the header
+@code{Command}, include that header in the payload
+of the message:
@example
Command: intercept\n
@@ -982,9 +945,9 @@ Length: 8\n
Command\n
@end example
-It is allowed to include multiple headers.
-You can also be more strict, and require
-a specific value for a header, for example:
+It is allowed to include multiple headers. You can
+also be more strict, and require a specific value
+for a header, for example:
@example
Command: intercept\n
@@ -994,13 +957,13 @@ Length: 16\n
Command: get-vt\n
@end example
-You may mix these two types of requirements
-freely. Your client will receive any message
-that satisfies at least one of the requirements,
-these requirements may be split into multiple
-message or coalesced into one message; but
-you cannot request to include receive a message
-if multiple requirements are satisfied.
+You may mix these two types of requirements freely.
+Your client will receive any message that satisfies
+at least one of the requirements, these requirements
+may be split into multiple message or coalesced into
+one message; but you cannot request to include
+receive a message if multiple requirements are
+satisfied.
Alternatively you can choose to stop receiving
message that satisfies requirements. For example:
@@ -1023,16 +986,15 @@ Message ID: 1\n
\n
@end example
-Note that this will stop you from receiving
-messages contain the @code{To} header addressed
-to you until you request to receiving such
-messages again.
+Note that this will stop you from receiving messages
+contain the @code{To} header addressed to you until
+you request to receiving such messages again.
-When you sign up for message you may request
-to be able to modify them before that are
-send to the next client in the list of client
-that should receive them. To do this include
-the header--value pair @code{Modifying: yes}:
+When you sign up for message you may request to be
+able to modify them before that are send to the next
+client in the list of client that should receive
+them. To do this include the header--value pair
+@code{Modifying: yes}:
@example
Command: intercept\n
@@ -1043,16 +1005,14 @@ Length: 30\n
Command: keyboard-enumeration\n
@end example
-It is up to the client to keep track of
-which message that it may modify. When
-you receive a message that you can modify
-you must respond when you are done with
-the message.
+It is up to the client to keep track of which message
+that it may modify. When you receive a message that
+you can modify you must respond when you are done
+with the message.
-For example, if you have signed up
-for @code{Command: keyboard-enumeration}
-with the ability to modify such messages
-and the message
+For example, if you have signed up for
+@code{Command: keyboard-enumeration} with the ability
+to modify such messages and the message
@example
Command: keyboard-enumeration\n
@@ -1064,8 +1024,7 @@ Length: 7\n
kernel\n
@end example
-is send from a server, you may receive
-it as
+is send from a server, you may receive it as
@example
Command: keyboard-enumeration\n
@@ -1078,23 +1037,19 @@ Modify ID: 4\n
kernel\n
@end example
-Be aware that the @code{Modify ID} may
-be included even if you have not signed
-up to be able to modify the message,
-it is enough that one client before you
-has or it was originally included
-@footnote{You may however not include
-this header when you send out an
+Be aware that the @code{Modify ID} may be included
+even if you have not signed up to be able to modify
+the message, it is enough that one client before you
+has or it was originally included @footnote{You may
+however not include this header when you send out an
orginal message.}.
-If you receive the message as such
-and want to add the line
-@code{on-screen-keyboard-20376} to
-the payload should send out:
-@footnote{The first line containing
-starting with @code{Message ID} is an
-example, it should be whatever is
-appropriate for your client.}
+If you receive the message as such and want to add
+the line @code{on-screen-keyboard-20376} to the
+payload should send out: @footnote{The first line
+containing starting with @code{Message ID} is an
+example, it should be whatever is appropriate for
+your client.}
@example
Modify ID: 4\n
@@ -1113,8 +1068,8 @@ kernel\n
on-screen-keyboard-20376\n
@end example
-If you however decide not to modify
-the message send out
+If you however decide not to modify the message send
+out
@example
Modify ID: 4\n
@@ -1125,12 +1080,10 @@ Modify: no\n
@cpindex Message consumption, message passing
@cpindex Consumption, interception, message passing
-There is also a third option:
-to consume to the message. This
-stops any further clients from
-receiving the message. This is
-done by modifying the message
-into an empty message:
+There is also a third option: to consume to the
+message. This stops any further clients from
+receiving the message. This is done by modifying
+the message into an empty message:
@example
Modify ID: 4\n
@@ -1139,34 +1092,25 @@ Modify: yes\n
\n
@end example
-You may choose to include the
-header--value pair @code{Length: 0},
-it is however redundant and
+You may choose to include the header--value pair
+@code{Length: 0}, it is however redundant and
discouraged.
@cpindex Interception priority, message passing
@cpindex Priority, interception, message passing
-This mechanism of being able to
-modify message does not make much
-sense unless you can control in
-the order the clients receive
-messages. This is done with what
-is called priority. The higher
-priority you have, the earlier
-you will receive the message. The
-default priority is zero, and the
-priority is bound to a signed
-64-bit integer. If you want to
-be able to list yourself in
-@code{Command: keyboard-enumeration}
-message, you should sign up
-with a positive priority since
-the final recipient or requested
-the enumeration will receive it
-with priority zero. Therefore
-you should sign up for such message
-with a message like:
-@footnote{4611686018427387904 is
+This mechanism of being able to modify message does
+not make much sense unless you can control in the
+order the clients receive messages. This is done with
+what is called priority. The higher priority you
+have, the earlier you will receive the message. The
+default priority is zero, and the priority is bound
+to a signed 64-bit integer. If you want to be able to
+list yourself in @code{Command: keyboard-enumeration}
+message, you should sign up with a positive priority
+since the final recipient or requested the
+enumeration will receive it with priority zero.
+Therefore you should sign up for such message with a
+message like: @footnote{4611686018427387904 is
halfway to the maximium value.}
@example
@@ -1200,7 +1144,8 @@ the minimum value of any signed value with a fixed
bit-size is the negative of its maximum value, that
is, the minimum value @code{int16_t} is to be assumed
to be @code{-INT16_MAX} (@math{-32767}) rather than
-@code{INT16_MIN} (@math{-32768} with two's complement.)
+@code{INT16_MIN} (@math{-32768} with two's
+complement.)
@item
Integers that are not especially encoded must not be
@@ -1216,35 +1161,32 @@ can be properly stored and used.
@cpindex Integers, unsigned, restriction
@cpindex Unsigned integer, restriction
@cpindex Restrictions on unsigned integers
-Integer 64-bits that are not especially encoded
-must not be unsigned if the bit-size is fixed.
-This is because some programming languages
-primitive integers are limited to 64-bits and
-are signed; a large enough unsigned 64-bit
-integer would overflow.
+Integer 64-bits that are not especially encoded must
+not be unsigned if the bit-size is fixed. This is
+ because some programming languages primitive
+integers are limited to 64-bits and are signed; a
+large enough unsigned 64-bit integer would overflow.
@item
@cpindex Endianness, portability
-Native endianness when a endianness is choosen.
-Do not assume big endianness, but the same
-endianness that appear on the same machine when
-using C@.
+Native endianness when a endianness is choosen. Do
+not assume big endianness, but the same endianness
+that appear on the same machine when using C@.
@item
@cpindex UTF-8, portability
@cpindex Strings, portibility
-All strings musts be encoded in UTF-8 without
-any NUL-character unless express permission
-is given. NUL-character may be encoded either
-using a zero byte or using Modified UTF-8, where
-it is encoded using two bytes. Which is used is
-selected in the protocol, however headers and
-their values must not include NUL-characters.
-No character may be encoded with more bytes than
-necessary. Encoding a character in extra long
-form is a security issue, and is prune to bugs,
-and is hence disallowed by newer specifications
-of UTF-8.
+All strings musts be encoded in UTF-8 without any
+NUL-character unless express permission is given.
+NUL-character may be encoded either using a zero byte
+or using Modified UTF-8, where it is encoded using
+two bytes. Which is used is selected in the protocol,
+however headers and their values must not include
+NUL-characters. No character may be encoded with more
+bytes than necessary. Encoding a character in extra
+long form is a security issue, and is prune to bugs,
+and is hence disallowed by newer specifications of
+UTF-8.
@item
@cpindex New line, portability
@@ -1279,11 +1221,11 @@ any other character, or multiple LF:s.
@cpindex Respawning servers, automatic
@cpindex Crash resilience
@command{mds-respawn} is a utility intended to be used
-in @file{$@{XDG_CONFIG_HOME@}/mdsinitrc}. It will spawn
-a selected set of servers. If a server it spawns exits
-with a bad status, @command{mds-respawn} will respawn it.
-@command{mds-respawn} supports two options in the command
-line:
+in @file{$@{XDG_CONFIG_HOME@}/mdsinitrc}. It will
+spawn a selected set of servers. If a server it
+spawns exits with a bad status, @command{mds-respawn}
+will respawn it. @command{mds-respawn} supports two
+options in the command line:
@table @option
@item --alarm=SECONDS
@@ -1318,17 +1260,17 @@ mds-respawn --interval=5 \
@opindex @option{--initial-spawn}
@opindex @option{--respawn}
will spawn and supervise the servers @command{mds-foo}
-and @command{mds-bar}. Both spawned with the
-argument @option{--initial-spawn}. When a server is
-respawed by @command{mds-respawn}, @option{--initial-spawn}
-in its argument list will be replaced by
+and @command{mds-bar}. Both spawned with the argument
+@option{--initial-spawn}. When a server is respawed
+by @command{mds-respawn}, @option{--initial-spawn} in
+its argument list will be replaced by
@option{--respawn} to let the server know it is being
respawned.
@sgindex @code{SIGTERM}
A server is considered to exit with a failure status
-unless it exits with the return value 0 or is terminated
-by the signal @code{SIGTERM}@.
+unless it exits with the return value 0 or is
+terminated by the signal @code{SIGTERM}@.
@@ -1342,16 +1284,17 @@ by the signal @code{SIGTERM}@.
@cpindex Registry of protocols
@opindex @option{--list}
@opindex @option{--wait}
-@command{mds-reg} is a utility that can be used to list
-available protocols provided by running servers. It can
-also wait for a set of protocols to become available. To
-list all available protocols run @command{mds-reg --list}.
-And to wait for the protocol @code{foo} run
-@command{mds-reg --wait=foo}. To also wait for the protocol
-@code{bar} run @command{mds-reg --wait=foo,bar} or
-@command{mds-reg --wait=foo --wait=bar}. Both of these
-styles can be mixed if you want to wait for even more
-protocols.
+@command{mds-reg} is a utility that can be used to
+list available protocols provided by running servers.
+It can also wait for a set of protocols to become
+available. To list all available protocols run
+@command{mds-reg --list}. And to wait for the
+protocol @code{foo} run @command{mds-reg --wait=foo}.
+To also wait for the protocol @code{bar} run
+@command{mds-reg --wait=foo,bar} or
+@command{mds-reg --wait=foo --wait=bar}. Both of
+thesestyles can be mixed if you want to wait for
+even more protocols.
@@ -1361,8 +1304,9 @@ protocols.
@pgindex @command{mds-clip}
@cpindex Clipboard
@command{mds-clip} is a utility that can be used to
-review the clipboards on the display and manipulate them.
-@command{mds-clip} recognises the following options:
+review the clipboards on the display and manipulate
+them. @command{mds-clip} recognises the following
+options:
@table @option
@item --push
@@ -1426,9 +1370,10 @@ Can be used with @option{--stdin} or @option{--list}.
If used with @option{--stdin}, an line containing
only @var{DELIMITER} will delimit two values that
should be placed in the clipboard. If used with
-@option{--list}, a line containing only @var{DELIMITER}
-will delimit two values in the output. The default
-delimiter for @option{--list} is an empty line.
+@option{--list}, a line containing only
+@var{DELIMITER} will delimit two values in the
+output. The default delimiter for @option{--list}
+is an empty line.
@item -1
@opindex @option{-1}
@@ -1464,34 +1409,34 @@ following options:
@table @option
@item --monitor
@opindex @option{--monitor}
-Take screenshot of the monitor. The rat will
-be used to select monitor.
+Take screenshot of the monitor. The rat will be used
+to select monitor.
@item --monitor=WINDOW_ID
@opindex @option{--monitor}
Take screenshot of the monitor whose root window's
-window ID is @var{WINDOW_ID} or has another window
-in it whose window ID is @var{WINDOW_ID}@.
+window ID is @var{WINDOW_ID} or has another window in
+it whose window ID is @var{WINDOW_ID}@.
@item --embed
@opindex @option{--embed}
-Take a screenshot of an embedded window.
-The rat will be used to select window.
+Take a screenshot of an embedded window. The rat will
+be used to select window.
@item --embed=WINDOW_ID
@opindex @option{--monitor}
-Take a screenshot of an embedded window whose
-window ID is @var{WINDOW_ID}@.
+Take a screenshot of an embedded window whose window
+ID is @var{WINDOW_ID}@.
@item --window
@opindex @option{--window}
-Take a screenshot a window.
-The rat will be used to select window.
+Take a screenshot a window. The rat will be used to
+select window.
@item --window=WINDOW_ID
@opindex @option{--window}
-Take a screenshot of a window whose
-window ID is @var{WINDOW_ID}@.
+Take a screenshot of a window whose window ID is
+@var{WINDOW_ID}@.
@item --decoration
@opindex @option{--decoration}
@@ -1529,8 +1474,8 @@ specifies the pathname of the saved file.
@opindex @option{--monitor}
@opindex @option{--embed}
If neither @option{--monitor}, @option{--embed} or
-@option{--window} is used, a screenshot will be
-taked of the display. That is, all monitors.
+@option{--window} is used, a screenshot will be taked
+of the display. That is, all monitors.
@opindex @option{--gamma}
@opindex @option{--low-gamma}
@@ -1558,33 +1503,30 @@ following options:
@table @option
@item --embed
@opindex @option{--embed}
-Kill an embedded window.
-The rat will be used to select window.
+Kill an embedded window. The rat will be used to
+select window.
@item --embed=WINDOW_ID
@opindex @option{--embed}
-Kill an embedded window whose
-window ID is @var{WINDOW_ID}@.
+Kill an embedded window whose window ID is
+@var{WINDOW_ID}@.
@item --window
@opindex @option{--window}
-Kill a window.
-The rat will be used to select window.
+Kill a window. The rat will be used to select window.
@item --window=WINDOW_ID
@opindex @option{--window}
-Kill a window whose
-window ID is @var{WINDOW_ID}@.
+Kill a window whose window ID is @var{WINDOW_ID}@.
@item --signal=SIGNAL
@opindex @option{--signal}
-Send the signal @var{SIGNAL} to the
-process owning the selected window.
+Send the signal @var{SIGNAL} to the process owning
+the selected window.
@item --no-signal
@opindex @option{--no-signal}
-Do not send a signal; only identify the
-window.
+Do not send a signal; only identify the window.
@item --keep-cursor
@opindex @option{--keep-cursor}
@@ -1605,17 +1547,18 @@ Print the ID of the selected window.
@cpindex Virtual terminal, switching
@cpindex Switching virtual terminal
@command{mds-chvt} is a utility similar to the command
-@command{chvt} from the @command{kbd} project. However,
-@command{mds-chvt} has setuid and therefore does not
-require root permissions, but it will only request a
-virtual terminal switch if the display server's virtual
-terminal is in the foreground. @command{mds-chvt}
-recognises the following options:
+@command{chvt} from the @command{kbd} project.
+However, @command{mds-chvt} has setuid and therefore
+does not require root permissions, but it will only
+request a virtual terminal switch if the display
+server's virtual terminal is in the foreground.
+@command{mds-chvt} recognises the following options:
@table @option
@item --switch=VT
@opindex @option{--switch}
-Switch to the virtual terminal with the index @var{VT}@.
+Switch to the virtual terminal with the index
+@var{VT}@.
@end table
@@ -1643,10 +1586,10 @@ TODO how to use mds-kbdc
@pgindex @file{mdsinitrc}
Servers let you use the option @option{--on-init-fork}
to put the process in the background when it has been
-initialised. This can used to spawn that depend on each
-other in linear order. For example, if @command{mds-bar}
-requires that @command{mds-foo} is initialised before it
-can be initialised, you can in
+initialised. This can used to spawn that depend on
+each other in linear order. For example, if
+@command{mds-bar} requires that @command{mds-foo} is
+initialised before it can be initialised, you can in
@file{$@{XDG_CONFIG_HOME@}/mdsinitrc} write:
@example
@@ -1661,15 +1604,16 @@ mds-bar &
@pgindex @command{mds-respawn}
@pgindex @command{cmdipc}
@pgindex @command{ipcmd}
-This will start @command{mds-bar} when @command{mds-foo}
-has been initialised. However if one of them crashes,
-that server will not respawn; to fix this @command{mds-respawn}
-can be used, but use of @command{mds-respawn} hinders
-the use of @option{--on-init-fork}. Instead you can use
-@option{--on-init-sh} and global semaphores. The packages,
-and commands, @command{cmdipc} and @command{ipcmd} can be
-used for this purpose. We will use @command{cmdipc} in an
-example:
+This will start @command{mds-bar} when
+@command{mds-foo} has been initialised. However if
+one of them crashes, that server will not respawn; to
+fix this @command{mds-respawn} can be used, but use
+of @command{mds-respawn} hinders the use of
+@option{--on-init-fork}. Instead you can use
+@option{--on-init-sh} and global semaphores. The
+packages, and commands, @command{cmdipc} and
+@command{ipcmd} can be used for this purpose. We will
+use @command{cmdipc} in an example:
@ifset AFOURPAPER
@example
@@ -1717,20 +1661,21 @@ mds-respawn @{ mds-bar @} & # Spawn `mds-bar`.
@end ifclear
@pgindex @command{mds-reg}
-This is however seldom necessary as @command{mds-reg} can
-often be used instead, with more abstraction as you would
-only need to specify what servers need to wait for, not
-what they provide.
+This is however seldom necessary as @command{mds-reg}
+can often be used instead, with more abstraction as
+you would only need to specify what servers need to
+wait for, not what they provide.
@pgindex @command{setpgrp}
@cpindex Display server process group
@cpindex Process group, display server
-Another useful command (and package) is @command{setpgrp}.
-@command{mds} puts itself an all its children in a new
-process group. However you may want to put processes that
-are not @command{mds} servers or @command{mds} utilities
-in a separate process group. @command{setpgrp} can be used
-to starta process in a new process group.
+Another useful command (and package) is
+@command{setpgrp}. @command{mds} puts itself an all
+its children in a new process group. However you may
+want to put processes that are not @command{mds}
+servers or @command{mds} utilities in a separate
+process group. @command{setpgrp} can be used to start
+a process in a new process group.
@@ -1742,12 +1687,13 @@ to starta process in a new process group.
@cpindex Kernel
@cpindex Display server kernel
@cpindex Master server
-An @command{mds} display server instance is comprised of
-multiple small servers that each implements a small part
-of the display server's functionallity. This chapter will
-include all servers but the master server, @command{mds-server}
-and the kernel, @command{mds}, the latter of which is not
-actually a server.
+An @command{mds} display server instance is comprised
+of multiple small servers that each implements a
+small part of the display server's functionallity.
+This chapter will include all servers but the master
+server, @command{mds-server} and the kernel,
+@command{mds}, the latter of which is not actually a
+server.
@menu
* mds-echo:: The @command{mds-echo} server.
@@ -1819,10 +1765,11 @@ actually a server.
@cpindex Debugging
@cpindex Heartbeat
@cpindex Network heartbeat
-@command{mds-echo} is a server that echos message that
-contain the header--value pair @command{Command: echo}.
-This server can be used for debugging and testing as
-well as to enable network heartbeats.
+@command{mds-echo} is a server that echos message
+that contain the header--value pair
+@command{Command: echo}.
+This server can be used for debugging and testing
+as well as to enable network heartbeats.
@@ -1834,10 +1781,11 @@ well as to enable network heartbeats.
@cpindex Protocols, listing
@cpindex Protocol registry
@cpindex Registry of protocols
-@command{mds-registry} is a server that keeps a registry
-of all protocols that are supported they the sum of all
-active servers. It can also be used by other servers to
-wait until a protocol has become available.
+@command{mds-registry} is a server that keeps a
+registry of all protocols that are supported they the
+sum of all active servers. It can also be used by
+other servers to wait until a protocol has become
+available.
@@ -1892,8 +1840,8 @@ package.
@cpindex Clipboard
@command{mds} has three clipboards, one for copied
text, one for selected text, and one for non-textual
-data. Each of these clipboards are stacks, just
-like in GNU Emacs. @command{mds-clipboard} implements
+data. Each of these clipboards are stacks, just like
+in GNU Emacs. @command{mds-clipboard} implements
these clipboards and automatic removal of outdated
clips. Clips can be configured to expire based on
time or when its originator closes.
@@ -1920,13 +1868,14 @@ drag-and-drop support.
@cpindex Keycodes
@cpindex Keycodes, remapping
@cpindex Keyboard, remapping
-@command{mds-kkbd} implements access to the kernel-based
-keyboard. It does not however implement delay and rate
-configurations for the kernel-based keyboard as that
-requires root privileges. The kernel-based keyboard is
-a keyboard that can be accessed by reconfiguring
-stdin in a TTY using @code{ioctl} and then read from
-stdin. @command{mds-kkbd} does not implement any keyboard
+@command{mds-kkbd} implements access to the
+kernel-based keyboard. It does not however implement
+delay and rate configurations for the kernel-based
+keyboard as that requires root privileges. The
+kernel-based keyboard is a keyboard that can be
+accessed by reconfiguring stdin in a TTY using
+@code{ioctl} and then read from stdin.
+@command{mds-kkbd} does not implement any keyboard
layout, rather it broadcasts scancodes and keycodes.
However it can remap keycodes, but not scancodes.