This feature was discussed in #6123, but it doesn't look like anything was ever incorporated into the IPython Notebook.

Here's a brief overview of the changes:

- Display of messages from other clients can be toggled on and off from within a notebook, either using the ``<M-m>e`` keyboard shortcut in the web UI, or through the option in the "Kernel" menu.
- notebook.js controls whether messages are displayed through a callback that is invoked from kernel.js when no callbacks are available for a message.
- The UI displays ``execute_input`` messages originating from an other clients in new cells at the end of the notebook. Output messages (``execute_result`` et al.) will only be displayed if a cell exists with a matching message ID.

Pending design questions:

- Should each ``execute_input`` message cause a new cell to be created?
- Should new cells be placed at the end of the notebook, or elsewhere? If the latter, what criteria should be followed?
Merge remote-tracking branch 'upstream/master'
Merge remote-tracking branch 'upstream/master'
Updated terminology to match the console/qtconsole
config settings and documentation more closely.

Unsolicited messages => output from other clients.
Increased notification message display time.
Merge remote-tracking branch 'upstream/master'
Removed keyboard shortcut.
Fixed inverted logic caused by renaming variables.
load the per kernel kernel.js and kernel.css

As per discussion, each kernel can provide a file name kernel.js that
we try to load at kernel switching. If such a file exist we assume that
the kernel pathches the javasscript and that this javascript cannot be
unpatched, and further switching of the kernel cannot be undone without
reloading the page. (separate PR for UI)

if a kernel provide kernel.js, the it should consist into a AMD module
definition that uses require.js the module shoudl define a function name
`onload` that will be called at the appropriate moment before the kernel
starts.
Fix typos, rephrase english. Thanks Kyle.
adresses Min comments
Make widgets persist across page refresh
pin less to 2.x

1.7.x causes different results, and it's probable that 3.x will as well.

It might even be appropriate to pin to 2.1.x.
move setting nb.kernelselector inside kernelselector itself
sort dashbord in frontend
allow Configurable._config_default to load default config
test _config_default
add IPython.config.get_config

returns config on global app if there is one
emit valid html:

Not closed div, <a> don't have alt but title, chrome frame has been
closed for at least a year, IE shoudl use edge mode. div cannot embed
span.
just indent everythin twice