patch 8.0.1123: cannot define a toolbar for a window

Problem:    Cannot define a toolbar for a window.
Solution:   Add a window-local toolbar.
diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt
index a66fbb3..7fb6a59 100644
--- a/runtime/doc/gui.txt
+++ b/runtime/doc/gui.txt
@@ -1,4 +1,4 @@
-*gui.txt*       For Vim version 8.0.  Last change: 2017 Aug 27
+*gui.txt*       For Vim version 8.0.  Last change: 2017 Sep 16
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -784,10 +784,31 @@
 from the main menu bar.  You must then use the |:popup| or |:tearoff| command
 to display it.
 
+							*window-toolbar*
+Each window can have a local toolbar.  This uses the first line of the window,
+thus reduces the space for the text by one line.
+
+Only text can be used.  When using Unicode special characters can be used to
+make the items look like icons.
+
+If the items do not fit then the last ones cannot be used.  The toolbar does
+not wrap.
+
+Example for debugger tools: >
+	amenu 1.10 WinBar.Step :Step<CR>
+	amenu 1.20 WinBar.Next :Next<CR>
+	amenu 1.30 WinBar.Finish :Finish<CR>
+	amenu 1.40 WinBar.Cont :Continue<CR>
+<
+The window toolbar uses the ToolbarLine and ToolbarButton highlight groups.
+
 							*popup-menu*
 In the Win32, GTK+, Motif, Athena and Photon GUI, you can define the
 special menu "PopUp".  This is the menu that is displayed when the right mouse
 button is pressed, if 'mousemodel' is set to popup or popup_setpos.
+Example: >
+    nnoremenu 1.40 PopUp.&Paste	"+gP
+    menu PopUp
 
 
 5.3 Showing What Menus Are Mapped To			*showing-menus*
diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt
index aad8e4a..bce1d6f 100644
--- a/runtime/doc/terminal.txt
+++ b/runtime/doc/terminal.txt
@@ -1,4 +1,4 @@
-*terminal.txt*	For Vim version 8.0.  Last change: 2017 Sep 14
+*terminal.txt*	For Vim version 8.0.  Last change: 2017 Sep 17
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -226,7 +226,7 @@
 contents of the terminal window is under control of Vim, the job output is
 suspended.  CTRL-\ CTRL-N does the same.
 
-Terminal-Job mode is where |tmap| mappings are applied. Keys sent by
+Terminal-Job mode is where |:tmap| mappings are applied. Keys sent by
 |term_sendkeys()| are not subject to tmap, but keys from |feedkeys()| are.
 
 							*E946*
@@ -234,7 +234,7 @@
 commands, Visually mark text, yank text, etc.  But you cannot change the
 contents of the buffer.  The commands that would start insert mode, such as
 'i' and 'a', return to Terminal-Job mode.  The window will be updated to show
-the contents of the terminal.
+the contents of the terminal. |:startinsert| is ineffective.
 
 In Terminal-Normal mode the statusline and window title show "(Terminal)".  If
 the job ends while in Terminal-Normal mode this changes to
@@ -372,6 +372,14 @@
  :Finish    execute the gdb "finish" command
  :Continue  execute the gdb "continue" command
 
+The plugin adds a window toolbar with these entries:
+  Step	    :Step
+  Next	    :Over
+  Finish    :Finish
+  Cont	    :Continue
+  Eval	    :Evaluate
+This way you can use the mouse to perform the most common commands.
+
 
 Inspecting variables ~
 
diff --git a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
index ffd53fa..d23a883 100644
--- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
@@ -104,6 +104,11 @@
   call win_gotoid(s:gdbwin)
 
   let s:breakpoints = {}
+
+  augroup TermDebug
+    au BufRead * call s:BufRead()
+    au BufUnload * call s:BufUnloaded()
+  augroup END
 endfunc
 
 func s:EndDebug(job, status)
@@ -120,6 +125,8 @@
   if s:save_columns > 0
     let &columns = s:save_columns
   endif
+
+  au! TermDebug
 endfunc
 
 " Handle a message received from gdb on the GDB/MI interface.
@@ -132,7 +139,7 @@
       let msg = msg[1:]
     endif
     if msg != ''
-      if msg =~ '^\*\(stopped\|running\)'
+      if msg =~ '^\(\*stopped\|\*running\|=thread-selected\)'
 	call s:HandleCursor(msg)
       elseif msg =~ '^\^done,bkpt=' || msg =~ '^=breakpoint-created,'
 	call s:HandleNewBreakpoint(msg)
@@ -161,6 +168,14 @@
 
   " TODO: can the K mapping be restored?
   nnoremap K :Evaluate<CR>
+
+  if has('menu')
+    amenu WinBar.Step :Step<CR>
+    amenu WinBar.Next :Over<CR>
+    amenu WinBar.Finish :Finish<CR>
+    amenu WinBar.Cont :Continue<CR>
+    amenu WinBar.Eval :Evaluate<CR>
+  endif
 endfunc
 
 " Delete installed debugger commands in the current window.
@@ -176,6 +191,15 @@
   delcommand Program
 
   nunmap K
+
+  if has('menu')
+    aunmenu WinBar.Step
+    aunmenu WinBar.Next
+    aunmenu WinBar.Finish
+    aunmenu WinBar.Cont
+    aunmenu WinBar.Eval
+  endif
+
   exe 'sign unplace ' . s:pc_id
   for key in keys(s:breakpoints)
     exe 'sign unplace ' . (s:break_id + key)
@@ -232,7 +256,15 @@
 
 " Handle the result of data-evaluate-expression
 func s:HandleEvaluate(msg)
-  echomsg '"' . s:evalexpr . '": ' . substitute(a:msg, '.*value="\(.*\)"', '\1', '')
+  let value = substitute(a:msg, '.*value="\(.*\)"', '\1', '')
+  let value = substitute(value, '\\"', '"', 'g')
+  echomsg '"' . s:evalexpr . '": ' . value
+
+  if s:evalexpr[0] != '*' && value =~ '^0x' && value !~ '"$'
+    " Looks like a pointer, also display what it points to.
+    let s:evalexpr = '*' . s:evalexpr
+    call term_sendkeys(s:commbuf, '-data-evaluate-expression "' . s:evalexpr . "\"\r")
+  endif
 endfunc
 
 " Handle an error.
@@ -247,10 +279,10 @@
 
   if win_gotoid(s:startwin)
     let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
-    if a:msg =~ '^\*stopped' && filereadable(fname)
+    if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
       let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
       if lnum =~ '^[0-9]*$'
-	if expand('%:h') != fname
+	if expand('%:p') != fnamemodify(fname, ':p')
 	  if &modified
 	    " TODO: find existing window
 	    exe 'split ' . fnameescape(fname)
@@ -260,7 +292,7 @@
 	  endif
 	endif
 	exe lnum
-	exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC file=' . fnameescape(fname)
+	exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC file=' . fname
 	setlocal signcolumn=yes
       endif
     else
@@ -288,11 +320,17 @@
 
   let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
   let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
-
-  exe 'sign place ' . (s:break_id + nr) . ' line=' . lnum . ' name=debugBreakpoint file=' . fnameescape(fname)
-
   let entry['fname'] = fname
   let entry['lnum'] = lnum
+
+  if bufloaded(fname)
+    call s:PlaceSign(nr, entry)
+  endif
+endfunc
+
+func s:PlaceSign(nr, entry)
+  exe 'sign place ' . (s:break_id + a:nr) . ' line=' . a:entry['lnum'] . ' name=debugBreakpoint file=' . a:entry['fname']
+  let a:entry['placed'] = 1
 endfunc
 
 " Handle deleting a breakpoint
@@ -302,6 +340,33 @@
   if nr == 0
     return
   endif
-  exe 'sign unplace ' . (s:break_id + nr)
-  unlet s:breakpoints[nr]
+  if has_key(s:breakpoints, nr)
+    let entry = s:breakpoints[nr]
+    if has_key(entry, 'placed')
+      exe 'sign unplace ' . (s:break_id + nr)
+      unlet entry['placed']
+    endif
+    unlet s:breakpoints[nr]
+  endif
 endfunc
+
+" Handle a BufRead autocommand event: place any signs.
+func s:BufRead()
+  let fname = expand('<afile>:p')
+  for [nr, entry] in items(s:breakpoints)
+    if entry['fname'] == fname
+      call s:PlaceSign(nr, entry)
+    endif
+  endfor
+endfunc
+
+" Handle a BufUnloaded autocommand event: unplace any signs.
+func s:BufUnloaded()
+  let fname = expand('<afile>:p')
+  for [nr, entry] in items(s:breakpoints)
+    if entry['fname'] == fname
+      let entry['placed'] = 0
+    endif
+  endfor
+endfunc
+