From 774db7902fdcef820b6089e73fd8f4d904dd548b Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Sun, 25 Jun 2017 10:45:18 -0400
Subject: [PATCH] fix scrollbar/menu display bug-- activating the menu was
 causing bottom scrollbar to appear fix edge case where menu was appearing on
 top of the dropdown button more commenting of oddities

---
 pd/nw/pdgui.js | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index 0e6f42526..aa9c5161b 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -4597,7 +4597,7 @@ function dropdown_populate(cid, label_array, current_index) {
 
 function gui_dropdown_activate(cid, obj_tag, tag, current_index, font_size, state, label_array) {
     var g, select_elem, svg_view, g_bbox,
-        w_height,    // excluding the scrollbar
+        doc_height,    // document height, excluding the scrollbar
         menu_height, // height of the list of elements inside the div
         div_y,       // position of div containing the dropdown menu
         div_max,     // max height of the div
@@ -4612,16 +4612,21 @@ function gui_dropdown_activate(cid, obj_tag, tag, current_index, font_size, stat
                 .viewBox.baseVal;
             select_elem = patchwin[cid]
                 .window.document.querySelector("#dropdown_list");
-            select_elem.style.setProperty("display", "inline");
             dropdown_populate(cid, label_array, current_index);
             // stick the obj_tag in a data field
             select_elem.setAttribute("data-callback", obj_tag);
             // display the menu so we can measure it
 
             g_bbox = g.getBoundingClientRect();
-            w_height =
+            // Measuring the document height is tricky-- the following
+            // method is the only reliable one I've found. And even here,
+            // if you display the select_elem as inline _before_ measuring
+            // the doc height, the result ends up being _smaller_. No idea.
+            doc_height =
                 patchwin[cid].window.document.documentElement
                     .clientHeight;
+            // Now let's display the select_elem div so we can measure it
+            select_elem.style.setProperty("display", "inline");
             menu_height = select_elem.querySelector("ol")
                 .getBoundingClientRect().height;
             scroll_y = patchwin[cid].window.scrollY;
@@ -4630,18 +4635,18 @@ function gui_dropdown_activate(cid, obj_tag, tag, current_index, font_size, stat
             // If the entire menu won't fit below the object but _will_
             // fit above it, display it above the object.
             // If the menu needs a scrollbar, display it below the object
-            if (w_height - g_bbox.bottom <= 75
-                || (menu_height > w_height - g_bbox.bottom
+            if (doc_height - g_bbox.bottom <= 75
+                || (menu_height > doc_height - g_bbox.bottom
                     && menu_height <= g_bbox.top)) {
                 // menu on top
                 offset_anchor = "bottom";
-                div_max = g_bbox.top - 1;
-                div_y = w_height - (g_bbox.top + scroll_y);
+                div_max = g_bbox.top - 2;
+                div_y = doc_height - (g_bbox.top + scroll_y);
             }
             else {
                 // menu on bottom (possibly with scrollbar)
                 offset_anchor = "top";
-                div_max = w_height - g_bbox.bottom - 1;
+                div_max = doc_height - g_bbox.bottom - 2;
                 div_y = g_bbox.bottom + scroll_y;
             }
             // set a max-height to force scrollbar if needed
-- 
GitLab