From 2053f04ddb0c49c06787f4f301357df29cc5b099 Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Fri, 23 Jun 2017 23:53:40 -0400
Subject: [PATCH] remove highlight when mouse goes outside the menu bbox

---
 pd/nw/pd_canvas.js | 41 ++++++++++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 13 deletions(-)

diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index c1f8946eb..a93120169 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -210,17 +210,23 @@ var canvas_events = (function() {
             svg.setAttribute("height", h);
         },
         dropdown_index_to_pd = function(elem) {
-            pdgui.pdsend(elem.getAttribute("data-callback"),
-                elem.querySelector(".highlighted").getAttribute("data-index"));
+            var highlighted = elem.querySelector(".highlighted");
+            if (highlighted) {
+                pdgui.pdsend(elem.getAttribute("data-callback"),
+                    highlighted.getAttribute("data-index"));
+            }
         },
-        dropdown_highlight_elem = function(elem, scroll) {
+        dropdown_clear_highlight = function() {
             var container = document.querySelector("#dropdown_list"),
-                li_array;
-            if (!elem.classList.contains("highlighted")) {
                 li_array = container.querySelectorAll("li");
-                Array.prototype.forEach.call(li_array, function(e) {
-                    e.classList.remove("highlighted");
-                });
+            Array.prototype.forEach.call(li_array, function(e) {
+                e.classList.remove("highlighted");
+            });
+        },
+        dropdown_highlight_elem = function(elem, scroll) {
+            var container = document.querySelector("#dropdown_list");
+            if (!elem.classList.contains("highlighted")) {
+                dropdown_clear_highlight();
                 elem.classList.add("highlighted");
                 // Make sure the highlighted element is in view
                 if (scroll) {
@@ -552,13 +558,21 @@ var canvas_events = (function() {
             dropdown_menu_keypress: function(evt) {
                 var li_nodes = document.querySelectorAll("#dropdown_list li"),
                     string_array = [],
+                    highlighted,
                     highlighted_index,
                     match,
                     offset;
-                highlighted_index =
-                    +document.querySelector("#dropdown_list .highlighted")
-                        .getAttribute("data-index");
-                offset = highlighted_index + 1;
+                highlighted = document
+                    .querySelector("#dropdown_list .highlighted");
+                if (highlighted) {
+                    highlighted_index =
+                        +document.querySelector("#dropdown_list .highlighted")
+                            .getAttribute("data-index");
+                    offset = highlighted_index + 1;
+                } else {
+                    highlighted_index = 1;
+                    offset = 2;
+                }
                 Array.prototype.forEach.call(li_nodes, function(e, i, a) {
                     var s = a[(i + offset) % a.length];
                     string_array.push(s.textContent.trim());
@@ -621,7 +635,6 @@ var canvas_events = (function() {
                 }
             },
             dropdown_menu_mousemove: function(evt) {
-                var li_array;
                 // For whatever reason, Chromium decides to trigger the
                 // mousemove/mouseenter/mouseover events if the element
                 // underneath it changes (or for mousemove, if the element
@@ -635,6 +648,8 @@ var canvas_events = (function() {
                         && evt.target.parentNode.parentNode
                         && evt.target.parentNode.parentNode.id === "dropdown_list") {
                         dropdown_highlight_elem(evt.target);
+                    } else {
+                        dropdown_clear_highlight();
                     }
                 }
                 last_dropdown_menu_x = evt.pageX;
-- 
GitLab