 
 redraw = throttle(redraw, 20)
 
+#               _   _ _
+#              | | (_) |
+#     ___ _ __ | |_ _| |_ _   _
+#    / _ \ '_ \| __| | __| | | |
+#   |  __/ | | | |_| | |_| |_| |
+#    \___|_| |_|\__|_|\__|\__, |
+#                          __/ |
+#                         |___/
+handle 'update:entity', -> redraw()
+
+#
+#
+#     ___ ___  _ ____   __
+#    / __/ _ \| '_ \ \ / /
+#   | (_| (_) | | | \ V /
+#    \___\___/|_| |_|\_/
+#
+#
+handle 'update:conv', -> redraw()
+
+#                                                 _
+#                                                | |
+#     ___ ___  _ ____   __   ___ ___  _   _ _ __ | |_
+#    / __/ _ \| '_ \ \ / /  / __/ _ \| | | | '_ \| __|
+#   | (_| (_) | | | \ V /  | (_| (_) | |_| | | | | |_
+#    \___\___/|_| |_|\_/    \___\___/ \__,_|_| |_|\__|
+#
+#
+handle 'update:conv_count', ->
+    dockicon viewstate
+    trayicon models
+
+#                            _              _              _   _ _   _
+#                           | |            | |            | | (_) | (_)
+#    ___  ___  __ _ _ __ ___| |__   ___  __| |   ___ _ __ | |_ _| |_ _  ___  ___
+#   / __|/ _ \/ _` | '__/ __| '_ \ / _ \/ _` |  / _ \ '_ \| __| | __| |/ _ \/ __|
+#   \__ \  __/ (_| | | | (__| | | |  __/ (_| | |  __/ | | | |_| | |_| |  __/\__ \
+#   |___/\___|\__,_|_|  \___|_| |_|\___|\__,_|  \___|_| |_|\__|_|\__|_|\___||___/
+#
+#
+handle 'update:searchedentities', -> redraw()
+
+#             _           _           _              _   _ _   _
+#            | |         | |         | |            | | (_) | (_)
+#    ___  ___| | ___  ___| |_ ___  __| |   ___ _ __ | |_ _| |_ _  ___  ___
+#   / __|/ _ \ |/ _ \/ __| __/ _ \/ _` |  / _ \ '_ \| __| | __| |/ _ \/ __|
+#   \__ \  __/ |  __/ (__| ||  __/ (_| | |  __/ | | | |_| | |_| |  __/\__ \
+#   |___/\___|_|\___|\___|\__\___|\__,_|  \___|_| |_|\__|_|\__|_|\___||___/
+#
+#
+handle 'update:selectedEntities', -> redraw()
+
+#                                    _   _   _
+#                                   | | | | (_)
+#     ___ ___  _ ____   __  ___  ___| |_| |_ _ _ __   __ _ ___
+#    / __/ _ \| '_ \ \ / / / __|/ _ \ __| __| | '_ \ / _` / __|
+#   | (_| (_) | | | \ V /  \__ \  __/ |_| |_| | | | | (_| \__ \
+#    \___\___/|_| |_|\_/   |___/\___|\__|\__|_|_| |_|\__, |___/
+#                                                     __/ |
+#                                                    |___/
+handle 'update:convsettings', -> redraw()
+
+#    _
+#   | |
+#   | | __ _ _ __   __ _ _   _  __ _  __ _  ___
+#   | |/ _` | '_ \ / _` | | | |/ _` |/ _` |/ _ \
+#   | | (_| | | | | (_| | |_| | (_| | (_| |  __/
+#   |_|\__,_|_| |_|\__, |\__,_|\__,_|\__, |\___|
+#                   __/ |             __/ |
+#                  |___/             |___/
 handle 'update:language', ->
     menu viewstate
     redraw()
 
-handle 'update:switchConv', ->
-    messages.scrollToBottom()
-
-handle 'update:beforeHistory', ->
-    applayout.recordMainPos()
-handle 'update:afterHistory', ->
-    applayout.adjustMainPos()
-
-handle 'update:beforeImg', ->
-    applayout.recordMainPos()
+#                 _ _       _
+#                (_) |     | |
+#    _____      ___| |_ ___| |__     ___ ___  _ ____   __
+#   / __\ \ /\ / / | __/ __| '_ \   / __/ _ \| '_ \ \ / /
+#   \__ \\ V  V /| | || (__| | | | | (_| (_) | | | \ V /
+#   |___/ \_/\_/ |_|\__\___|_| |_|  \___\___/|_| |_|\_/
+#
+#
+handle 'update:switchConv', -> messages.scrollToBottom()
+
+#    _           __                 _     _     _
+#   | |         / _|               | |   (_)   | |
+#   | |__   ___| |_ ___  _ __ ___  | |__  _ ___| |_ ___  _ __ _   _
+#   | '_ \ / _ \  _/ _ \| '__/ _ \ | '_ \| / __| __/ _ \| '__| | | |
+#   | |_) |  __/ || (_) | | |  __/ | | | | \__ \ || (_) | |  | |_| |
+#   |_.__/ \___|_| \___/|_|  \___| |_| |_|_|___/\__\___/|_|   \__, |
+#                                                              __/ |
+#                                                             |___/
+handle 'update:beforeHistory', -> applayout.recordMainPos()
+
+#           __ _              _     _     _
+#          / _| |            | |   (_)   | |
+#     __ _| |_| |_ ___ _ __  | |__  _ ___| |_ ___  _ __ _   _
+#    / _` |  _| __/ _ \ '__| | '_ \| / __| __/ _ \| '__| | | |
+#   | (_| | | | ||  __/ |    | | | | \__ \ || (_) | |  | |_| |
+#    \__,_|_|  \__\___|_|    |_| |_|_|___/\__\___/|_|   \__, |
+#                                                        __/ |
+#                                                       |___/
+handle 'update:afterHistory', -> applayout.adjustMainPos()
+
+#    _           __                 _
+#   | |         / _|               (_)
+#   | |__   ___| |_ ___  _ __ ___   _ _ __ ___   __ _
+#   | '_ \ / _ \  _/ _ \| '__/ _ \ | | '_ ` _ \ / _` |
+#   | |_) |  __/ || (_) | | |  __/ | | | | | | | (_| |
+#   |_.__/ \___|_| \___/|_|  \___| |_|_| |_| |_|\__, |
+#                                                __/ |
+#                                               |___/
+handle 'update:beforeImg', -> applayout.recordMainPos()
+
+#           __ _              _
+#          / _| |            (_)
+#     __ _| |_| |_ ___ _ __   _ _ __ ___   __ _
+#    / _` |  _| __/ _ \ '__| | | '_ ` _ \ / _` |
+#   | (_| | | | ||  __/ |    | | | | | | | (_| |
+#    \__,_|_|  \__\___|_|    |_|_| |_| |_|\__, |
+#                                          __/ |
+#                                         |___/
 handle 'update:afterImg', ->
     if viewstate.atbottom
         messages.scrollToBottom()
     else
         applayout.adjustMainPos()
 
+#        _             _     _               _
+#       | |           | |   | |             (_)
+#    ___| |_ __ _ _ __| |_  | |_ _   _ _ __  _ _ __   __ _
+#   / __| __/ _` | '__| __| | __| | | | '_ \| | '_ \ / _` |
+#   \__ \ || (_| | |  | |_  | |_| |_| | |_) | | | | | (_| |
+#   |___/\__\__,_|_|   \__|  \__|\__, | .__/|_|_| |_|\__, |
+#                                 __/ | |             __/ |
+#                                |___/|_|            |___/
 handle 'update:startTyping', ->
     if viewstate.atbottom
         messages.scrollToBottom()

    else
        console.log 'unknown viewstate.state', viewstate.state

handle 'update:entity', ->
    redraw()

handle 'update:conv', ->
    redraw()

handle 'update:conv_count', ->
    dockicon viewstate
    trayicon models

handle 'update:searchedentities', ->
  redraw()

handle 'update:selectedEntities', ->
  redraw()

handle 'update:convsettings', -> redraw()

redraw = ->
    notifications models
    convhead models

    convadd models
    startup models

throttle = (fn, time=10) ->
    timeout = false
    # return a throttled version of fn
