Browse Source

Merge pull request #729 from diggit/fixes

Fixes of scrollbar drag and dynamic panel footer filling
Micha Mettke 7 years ago
parent
commit
744cd2cc93
3 changed files with 35 additions and 32 deletions
  1. 30 29
      nuklear.h
  2. 2 2
      src/nuklear_panel.c
  3. 3 1
      src/nuklear_scrollbar.c

+ 30 - 29
nuklear.h

@@ -673,8 +673,8 @@ NK_API void nk_set_user_data(struct nk_context*, nk_handle handle);
 /*/// ### Input
 /*/// ### Input
 /// The input API is responsible for holding the current input state composed of
 /// The input API is responsible for holding the current input state composed of
 /// mouse, key and text input states.
 /// mouse, key and text input states.
-/// It is worth noting that no direct OS or window handling is done in nuklear.
-/// Instead all input state has to be provided by platform specific code. This on one hand
+/// It is worth noting that no direct os or window handling is done in nuklear.
+/// Instead all input state has to be provided by platform specific code. This in one hand
 /// expects more work from the user and complicates usage but on the other hand
 /// expects more work from the user and complicates usage but on the other hand
 /// provides simple abstraction over a big number of platforms, libraries and other
 /// provides simple abstraction over a big number of platforms, libraries and other
 /// already provided functionality.
 /// already provided functionality.
@@ -775,7 +775,7 @@ enum nk_buttons {
 };
 };
 /*/// #### nk_input_begin
 /*/// #### nk_input_begin
 /// Begins the input mirroring process by resetting text, scroll
 /// Begins the input mirroring process by resetting text, scroll
-/// mouse, previous mouse position and movement as well as key state transitions,
+/// mouse previous mouse position and movement as well as key state transitions,
 ///
 ///
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// void nk_input_begin(struct nk_context*);
 /// void nk_input_begin(struct nk_context*);
@@ -801,7 +801,7 @@ NK_API void nk_input_begin(struct nk_context*);
 */
 */
 NK_API void nk_input_motion(struct nk_context*, int x, int y);
 NK_API void nk_input_motion(struct nk_context*, int x, int y);
 /*/// #### nk_input_key
 /*/// #### nk_input_key
-/// Mirrors the state of a specific key to nuklear
+/// Mirrors state of a specific key to nuklear
 ///
 ///
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// void nk_input_key(struct nk_context*, enum nk_keys key, int down);
 /// void nk_input_key(struct nk_context*, enum nk_keys key, int down);
@@ -833,7 +833,6 @@ NK_API void nk_input_button(struct nk_context*, enum nk_buttons, int x, int y, i
 /*/// #### nk_input_scroll
 /*/// #### nk_input_scroll
 /// Copies the last mouse scroll value to nuklear. Is generally
 /// Copies the last mouse scroll value to nuklear. Is generally
 /// a scroll value. So does not have to come from mouse and could also originate
 /// a scroll value. So does not have to come from mouse and could also originate
-/// TODO finish this sentence
 ///
 ///
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// void nk_input_scroll(struct nk_context *ctx, struct nk_vec2 val);
 /// void nk_input_scroll(struct nk_context *ctx, struct nk_vec2 val);
@@ -898,7 +897,7 @@ NK_API void nk_input_glyph(struct nk_context*, const nk_glyph);
 NK_API void nk_input_unicode(struct nk_context*, nk_rune);
 NK_API void nk_input_unicode(struct nk_context*, nk_rune);
 /*/// #### nk_input_end
 /*/// #### nk_input_end
 /// End the input mirroring process by resetting mouse grabbing
 /// End the input mirroring process by resetting mouse grabbing
-/// state to ensure the mouse cursor is not grabbed indefinitely.
+/// state to ensure the mouse cursor is not grabbed indefinitely.///
 ///
 ///
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// void nk_input_end(struct nk_context *ctx);
 /// void nk_input_end(struct nk_context *ctx);
@@ -1178,7 +1177,7 @@ struct nk_convert_config {
 */
 */
 NK_API const struct nk_command* nk__begin(struct nk_context*);
 NK_API const struct nk_command* nk__begin(struct nk_context*);
 /*/// #### nk__next
 /*/// #### nk__next
-/// Returns draw command pointer pointing to the next command inside the draw command list
+/// Returns a draw command list iterator to iterate all draw
 ///
 ///
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// const struct nk_command* nk__next(struct nk_context*, const struct nk_command*);
 /// const struct nk_command* nk__next(struct nk_context*, const struct nk_command*);
@@ -1204,7 +1203,7 @@ NK_API const struct nk_command* nk__next(struct nk_context*, const struct nk_com
 /// __ctx__     | Must point to an previously initialized `nk_context` struct at the end of a frame
 /// __ctx__     | Must point to an previously initialized `nk_context` struct at the end of a frame
 /// __cmd__     | Command pointer initialized to NULL
 /// __cmd__     | Command pointer initialized to NULL
 ///
 ///
-/// Iterates over each draw command inside the context draw command list
+/// Returns draw command pointer pointing to the next command inside the draw command list
 */
 */
 #define nk_foreach(c, ctx) for((c) = nk__begin(ctx); (c) != 0; (c) = nk__next(ctx,c))
 #define nk_foreach(c, ctx) for((c) = nk__begin(ctx); (c) != 0; (c) = nk__next(ctx,c))
 #ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT
 #ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT
@@ -1239,7 +1238,7 @@ NK_API const struct nk_command* nk__next(struct nk_context*, const struct nk_com
 */
 */
 NK_API nk_flags nk_convert(struct nk_context*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*);
 NK_API nk_flags nk_convert(struct nk_context*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*);
 /*/// #### nk__draw_begin
 /*/// #### nk__draw_begin
-/// Returns a draw vertex command buffer iterator to iterate over the vertex draw command buffer
+/// Returns a draw vertex command buffer iterator to iterate each the vertex draw command buffer
 ///
 ///
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// const struct nk_draw_command* nk__draw_begin(const struct nk_context*, const struct nk_buffer*);
 /// const struct nk_draw_command* nk__draw_begin(const struct nk_context*, const struct nk_buffer*);
@@ -1307,7 +1306,7 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
 /// ### Window
 /// ### Window
 /// Windows are the main persistent state used inside nuklear and are life time
 /// Windows are the main persistent state used inside nuklear and are life time
 /// controlled by simply "retouching" (i.e. calling) each window each frame.
 /// controlled by simply "retouching" (i.e. calling) each window each frame.
-/// All widgets inside nuklear can only be added inside the function pair `nk_begin_xxx`
+/// All widgets inside nuklear can only be added inside function pair `nk_begin_xxx`
 /// and `nk_end`. Calling any widgets outside these two functions will result in an
 /// and `nk_end`. Calling any widgets outside these two functions will result in an
 /// assert in debug or no state change in release mode.<br /><br />
 /// assert in debug or no state change in release mode.<br /><br />
 ///
 ///
@@ -1478,7 +1477,7 @@ enum nk_panel_flags {
 NK_API int nk_begin(struct nk_context *ctx, const char *title, struct nk_rect bounds, nk_flags flags);
 NK_API int nk_begin(struct nk_context *ctx, const char *title, struct nk_rect bounds, nk_flags flags);
 /*/// #### nk_begin_titled
 /*/// #### nk_begin_titled
 /// Extended window start with separated title and identifier to allow multiple
 /// Extended window start with separated title and identifier to allow multiple
-/// windows with same title but not name
+/// windows with same name but not title
 ///
 ///
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// int nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, struct nk_rect bounds, nk_flags flags);
 /// int nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, struct nk_rect bounds, nk_flags flags);
@@ -1522,12 +1521,12 @@ NK_API void nk_end(struct nk_context *ctx);
 /// __name__    | Window identifier
 /// __name__    | Window identifier
 ///
 ///
 /// Returns a `nk_window` struct pointing to the identified window or NULL if
 /// Returns a `nk_window` struct pointing to the identified window or NULL if
-/// no window with the given name was found
+/// no window with given name was found
 */
 */
 NK_API struct nk_window *nk_window_find(struct nk_context *ctx, const char *name);
 NK_API struct nk_window *nk_window_find(struct nk_context *ctx, const char *name);
 /*/// #### nk_window_get_bounds
 /*/// #### nk_window_get_bounds
-/// Returns a rectangle with screen position and size of the currently processed window
 ///
 ///
+/// Returns a rectangle with screen position and size of the currently processed window
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
@@ -1541,9 +1540,9 @@ NK_API struct nk_window *nk_window_find(struct nk_context *ctx, const char *name
 /// Returns a `nk_rect` struct with window upper left window position and size
 /// Returns a `nk_rect` struct with window upper left window position and size
 */
 */
 NK_API struct nk_rect nk_window_get_bounds(const struct nk_context *ctx);
 NK_API struct nk_rect nk_window_get_bounds(const struct nk_context *ctx);
-/*/// #### nk_window_get_position
-/// Returns the position of the currently processed window.
+/*/// #### nk_window_get_bounds
 ///
 ///
+/// Returns the position of the currently processed window.
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
@@ -1558,8 +1557,8 @@ NK_API struct nk_rect nk_window_get_bounds(const struct nk_context *ctx);
 */
 */
 NK_API struct nk_vec2 nk_window_get_position(const struct nk_context *ctx);
 NK_API struct nk_vec2 nk_window_get_position(const struct nk_context *ctx);
 /*/// #### nk_window_get_size
 /*/// #### nk_window_get_size
-/// Returns the size with width and height of the currently processed window.
 ///
 ///
+/// Returns the size with width and height of the currently processed window.
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
@@ -1574,8 +1573,8 @@ NK_API struct nk_vec2 nk_window_get_position(const struct nk_context *ctx);
 */
 */
 NK_API struct nk_vec2 nk_window_get_size(const struct nk_context*);
 NK_API struct nk_vec2 nk_window_get_size(const struct nk_context*);
 /*/// #### nk_window_get_width
 /*/// #### nk_window_get_width
-/// Returns the width of the currently processed window.
 ///
 ///
+/// Returns the width of the currently processed window.
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
@@ -1590,8 +1589,8 @@ NK_API struct nk_vec2 nk_window_get_size(const struct nk_context*);
 */
 */
 NK_API float nk_window_get_width(const struct nk_context*);
 NK_API float nk_window_get_width(const struct nk_context*);
 /*/// #### nk_window_get_height
 /*/// #### nk_window_get_height
-/// Returns the height of the currently processed window.
 ///
 ///
+/// Returns the height of the currently processed window.
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
@@ -1606,12 +1605,12 @@ NK_API float nk_window_get_width(const struct nk_context*);
 */
 */
 NK_API float nk_window_get_height(const struct nk_context*);
 NK_API float nk_window_get_height(const struct nk_context*);
 /*/// #### nk_window_get_panel
 /*/// #### nk_window_get_panel
-/// Returns the underlying panel which contains all processing state of the current window.
 ///
 ///
+/// Returns the underlying panel which contains all processing state of the current window.
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 /// !!! WARNING
 /// !!! WARNING
-///     Do not keep the returned panel pointer around, it is only valid until `nk_end`
+///     Do not keep the returned panel pointer around it is only valid until `nk_end`
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// struct nk_panel* nk_window_get_panel(struct nk_context *ctx);
 /// struct nk_panel* nk_window_get_panel(struct nk_context *ctx);
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1624,9 +1623,9 @@ NK_API float nk_window_get_height(const struct nk_context*);
 */
 */
 NK_API struct nk_panel* nk_window_get_panel(struct nk_context*);
 NK_API struct nk_panel* nk_window_get_panel(struct nk_context*);
 /*/// #### nk_window_get_content_region
 /*/// #### nk_window_get_content_region
+///
 /// Returns the position and size of the currently visible and non-clipped space
 /// Returns the position and size of the currently visible and non-clipped space
 /// inside the currently processed window.
 /// inside the currently processed window.
-///
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///
 ///
@@ -1643,9 +1642,9 @@ NK_API struct nk_panel* nk_window_get_panel(struct nk_context*);
 */
 */
 NK_API struct nk_rect nk_window_get_content_region(struct nk_context*);
 NK_API struct nk_rect nk_window_get_content_region(struct nk_context*);
 /*/// #### nk_window_get_content_region_min
 /*/// #### nk_window_get_content_region_min
+///
 /// Returns the upper left position of the currently visible and non-clipped
 /// Returns the upper left position of the currently visible and non-clipped
 /// space inside the currently processed window.
 /// space inside the currently processed window.
-///
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///
 ///
@@ -1662,9 +1661,9 @@ NK_API struct nk_rect nk_window_get_content_region(struct nk_context*);
 */
 */
 NK_API struct nk_vec2 nk_window_get_content_region_min(struct nk_context*);
 NK_API struct nk_vec2 nk_window_get_content_region_min(struct nk_context*);
 /*/// #### nk_window_get_content_region_max
 /*/// #### nk_window_get_content_region_max
+///
 /// Returns the lower right screen position of the currently visible and
 /// Returns the lower right screen position of the currently visible and
 /// non-clipped space inside the currently processed window.
 /// non-clipped space inside the currently processed window.
-///
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///
 ///
@@ -1681,9 +1680,9 @@ NK_API struct nk_vec2 nk_window_get_content_region_min(struct nk_context*);
 */
 */
 NK_API struct nk_vec2 nk_window_get_content_region_max(struct nk_context*);
 NK_API struct nk_vec2 nk_window_get_content_region_max(struct nk_context*);
 /*/// #### nk_window_get_content_region_size
 /*/// #### nk_window_get_content_region_size
+///
 /// Returns the size of the currently visible and non-clipped space inside the
 /// Returns the size of the currently visible and non-clipped space inside the
 /// currently processed window
 /// currently processed window
-///
 /// !!! WARNING
 /// !!! WARNING
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///     Only call this function between calls `nk_begin_xxx` and `nk_end`
 ///
 ///
@@ -2291,7 +2290,7 @@ NK_API float nk_layout_ratio_from_pixel(struct nk_context*, float pixel_width);
 /// __columns__ | Number of widget inside row
 /// __columns__ | Number of widget inside row
 */
 */
 NK_API void nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols);
 NK_API void nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols);
-/*/// #### nk_layout_row_static
+/*/// #### nk_layout_row_dynamic
 /// Sets current row layout to fill @cols number of widgets
 /// Sets current row layout to fill @cols number of widgets
 /// in row with same @item_width horizontal size. Once called all subsequent widget
 /// in row with same @item_width horizontal size. Once called all subsequent widget
 /// calls greater than @cols will allocate a new row with same layout.
 /// calls greater than @cols will allocate a new row with same layout.
@@ -2481,7 +2480,7 @@ NK_API struct nk_rect nk_layout_space_bounds(struct nk_context*);
 /// Returns transformed `nk_vec2` in screen space coordinates
 /// Returns transformed `nk_vec2` in screen space coordinates
 */
 */
 NK_API struct nk_vec2 nk_layout_space_to_screen(struct nk_context*, struct nk_vec2);
 NK_API struct nk_vec2 nk_layout_space_to_screen(struct nk_context*, struct nk_vec2);
-/*/// #### nk_layout_space_to_local
+/*/// #### nk_layout_space_to_screen
 /// Converts vector from layout space into screen space
 /// Converts vector from layout space into screen space
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
 /// struct nk_vec2 nk_layout_space_to_local(struct nk_context*, struct nk_vec2);
 /// struct nk_vec2 nk_layout_space_to_local(struct nk_context*, struct nk_vec2);
@@ -15811,11 +15810,11 @@ nk_panel_end(struct nk_context *ctx)
         nk_fill_rect(out, empty_space, 0, style->window.background);
         nk_fill_rect(out, empty_space, 0, style->window.background);
 
 
         /* fill bottom empty space */
         /* fill bottom empty space */
-        if (*layout->offset_x != 0 && !(layout->flags & NK_WINDOW_NO_SCROLLBAR)) {
+        if (layout->footer_height > 0) {
             empty_space.x = window->bounds.x;
             empty_space.x = window->bounds.x;
             empty_space.y = layout->bounds.y + layout->bounds.h;
             empty_space.y = layout->bounds.y + layout->bounds.h;
             empty_space.w = window->bounds.w;
             empty_space.w = window->bounds.w;
-            empty_space.h = scrollbar_size.y;
+            empty_space.h = layout->footer_height;
             nk_fill_rect(out, empty_space, 0, style->window.background);
             nk_fill_rect(out, empty_space, 0, style->window.background);
         }
         }
     }
     }
@@ -21193,6 +21192,7 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
 {
 {
     nk_flags ws = 0;
     nk_flags ws = 0;
     int left_mouse_down;
     int left_mouse_down;
+    int left_mouse_clicked;
     int left_mouse_click_in_cursor;
     int left_mouse_click_in_cursor;
     float scroll_delta;
     float scroll_delta;
 
 
@@ -21200,13 +21200,14 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
     if (!in) return scroll_offset;
     if (!in) return scroll_offset;
 
 
     left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
     left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
+    left_mouse_clicked = in->mouse.buttons[NK_BUTTON_LEFT].clicked;
     left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
     left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
         NK_BUTTON_LEFT, *cursor, nk_true);
         NK_BUTTON_LEFT, *cursor, nk_true);
     if (nk_input_is_mouse_hovering_rect(in, *scroll))
     if (nk_input_is_mouse_hovering_rect(in, *scroll))
         *state = NK_WIDGET_STATE_HOVERED;
         *state = NK_WIDGET_STATE_HOVERED;
 
 
     scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x;
     scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x;
-    if (left_mouse_down && left_mouse_click_in_cursor) {
+    if (left_mouse_down && left_mouse_click_in_cursor && !left_mouse_clicked) {
         /* update cursor by mouse dragging */
         /* update cursor by mouse dragging */
         float pixel, delta;
         float pixel, delta;
         *state = NK_WIDGET_STATE_ACTIVE;
         *state = NK_WIDGET_STATE_ACTIVE;

+ 2 - 2
src/nuklear_panel.c

@@ -371,11 +371,11 @@ nk_panel_end(struct nk_context *ctx)
         nk_fill_rect(out, empty_space, 0, style->window.background);
         nk_fill_rect(out, empty_space, 0, style->window.background);
 
 
         /* fill bottom empty space */
         /* fill bottom empty space */
-        if (*layout->offset_x != 0 && !(layout->flags & NK_WINDOW_NO_SCROLLBAR)) {
+        if (layout->footer_height > 0) {
             empty_space.x = window->bounds.x;
             empty_space.x = window->bounds.x;
             empty_space.y = layout->bounds.y + layout->bounds.h;
             empty_space.y = layout->bounds.y + layout->bounds.h;
             empty_space.w = window->bounds.w;
             empty_space.w = window->bounds.w;
-            empty_space.h = scrollbar_size.y;
+            empty_space.h = layout->footer_height;
             nk_fill_rect(out, empty_space, 0, style->window.background);
             nk_fill_rect(out, empty_space, 0, style->window.background);
         }
         }
     }
     }

+ 3 - 1
src/nuklear_scrollbar.c

@@ -15,6 +15,7 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
 {
 {
     nk_flags ws = 0;
     nk_flags ws = 0;
     int left_mouse_down;
     int left_mouse_down;
+    int left_mouse_clicked;
     int left_mouse_click_in_cursor;
     int left_mouse_click_in_cursor;
     float scroll_delta;
     float scroll_delta;
 
 
@@ -22,13 +23,14 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
     if (!in) return scroll_offset;
     if (!in) return scroll_offset;
 
 
     left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
     left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
+    left_mouse_clicked = in->mouse.buttons[NK_BUTTON_LEFT].clicked;
     left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
     left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
         NK_BUTTON_LEFT, *cursor, nk_true);
         NK_BUTTON_LEFT, *cursor, nk_true);
     if (nk_input_is_mouse_hovering_rect(in, *scroll))
     if (nk_input_is_mouse_hovering_rect(in, *scroll))
         *state = NK_WIDGET_STATE_HOVERED;
         *state = NK_WIDGET_STATE_HOVERED;
 
 
     scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x;
     scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x;
-    if (left_mouse_down && left_mouse_click_in_cursor) {
+    if (left_mouse_down && left_mouse_click_in_cursor && !left_mouse_clicked) {
         /* update cursor by mouse dragging */
         /* update cursor by mouse dragging */
         float pixel, delta;
         float pixel, delta;
         *state = NK_WIDGET_STATE_ACTIVE;
         *state = NK_WIDGET_STATE_ACTIVE;