aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--VERSION2
-rw-r--r--d2tk/base.h12
-rw-r--r--src/base.c76
-rw-r--r--src/base_internal.h2
4 files changed, 81 insertions, 11 deletions
diff --git a/VERSION b/VERSION
index d01eb46..c258673 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.1.977
+0.1.979
diff --git a/d2tk/base.h b/d2tk/base.h
index 6b92457..78357c7 100644
--- a/d2tk/base.h
+++ b/d2tk/base.h
@@ -645,6 +645,12 @@ d2tk_base_set_butmask(d2tk_base_t *base, d2tk_butmask_t mask, bool down);
D2TK_API bool
d2tk_base_get_butmask(d2tk_base_t *base, d2tk_butmask_t mask, bool clear);
+D2TK_API bool
+d2tk_base_get_butmask_down(d2tk_base_t *base, d2tk_butmask_t mask);
+
+D2TK_API bool
+d2tk_base_get_butmask_up(d2tk_base_t *base, d2tk_butmask_t mask);
+
D2TK_API void
d2tk_base_set_mouse_pos(d2tk_base_t *base, d2tk_coord_t x, d2tk_coord_t y);
@@ -670,6 +676,12 @@ d2tk_base_set_keymask(d2tk_base_t *base, d2tk_keymask_t mask, bool down);
D2TK_API bool
d2tk_base_get_keymask(d2tk_base_t *base, d2tk_keymask_t mask, bool clear);
+D2TK_API bool
+d2tk_base_get_keymask_down(d2tk_base_t *base, d2tk_keymask_t mask);
+
+D2TK_API bool
+d2tk_base_get_keymask_up(d2tk_base_t *base, d2tk_keymask_t mask);
+
D2TK_API void
d2tk_base_set_dimensions(d2tk_base_t *base, d2tk_coord_t w, d2tk_coord_t h);
diff --git a/src/base.c b/src/base.c
index 77a29f3..5ce1ec1 100644
--- a/src/base.c
+++ b/src/base.c
@@ -467,6 +467,15 @@ d2tk_base_is_active_hot(d2tk_base_t *base, d2tk_id_t id,
bool newfocus = curfocus;
const bool lastfocus = _d2tk_flip_equal_old(&base->focusitem, id);
+ // test for mouse up
+ if( is_active
+ && !d2tk_base_get_butmask(base, D2TK_BUTMASK_LEFT, false) )
+ {
+ _d2tk_flip_clear(&base->activeitem);
+ is_active = false;
+ state |= D2TK_STATE_UP;
+ }
+
// handle forward focus
if(curfocus)
{
@@ -505,11 +514,19 @@ d2tk_base_is_active_hot(d2tk_base_t *base, d2tk_id_t id,
}
}
- if(d2tk_base_get_keymask(base, D2TK_KEYMASK_ENTER, false))
+ if(d2tk_base_get_keymask_up(base, D2TK_KEYMASK_ENTER))
+ {
+ is_active = false;
+ }
+ else if(d2tk_base_get_keymask_down(base, D2TK_KEYMASK_ENTER))
{
is_active = true;
state |= D2TK_STATE_ENTER;
}
+ else if(d2tk_base_get_keymask(base, D2TK_KEYMASK_ENTER, false))
+ {
+ is_active = true;
+ }
}
else if(!base->focused)
{
@@ -518,15 +535,6 @@ d2tk_base_is_active_hot(d2tk_base_t *base, d2tk_id_t id,
base->focused = true; // set focused flag
}
- // test for mouse up
- if( is_active
- && !d2tk_base_get_butmask(base, D2TK_BUTMASK_LEFT, false) )
- {
- _d2tk_flip_clear(&base->activeitem);
- is_active = false;
- state |= D2TK_STATE_UP;
- }
-
// test for mouse over
if(d2tk_base_is_hit(base, rect))
{
@@ -799,6 +807,9 @@ d2tk_base_post(d2tk_base_t *base)
base->focused = false;
}
+ base->mouse.mask_prev = base->mouse.mask;
+ base->keys.mask_prev = base->keys.mask;
+
_d2tk_base_clear_chars(base);
d2tk_core_post(base->core);
@@ -921,6 +932,29 @@ d2tk_base_get_butmask(d2tk_base_t *base, d2tk_butmask_t mask, bool clear)
}
D2TK_API bool
+d2tk_base_get_butmask_prev(d2tk_base_t *base, d2tk_butmask_t mask)
+{
+ const bool old_state = (base->mouse.mask_prev & mask) == mask;
+
+ return old_state;
+
+}
+
+D2TK_API bool
+d2tk_base_get_butmask_down(d2tk_base_t *base, d2tk_butmask_t mask)
+{
+ return !d2tk_base_get_butmask_prev(base, mask)
+ && d2tk_base_get_butmask(base, mask, false);
+}
+
+D2TK_API bool
+d2tk_base_get_butmask_up(d2tk_base_t *base, d2tk_butmask_t mask)
+{
+ return d2tk_base_get_butmask_prev(base, mask)
+ && !d2tk_base_get_butmask(base, mask, false);
+}
+
+D2TK_API bool
d2tk_base_set_modmask(d2tk_base_t *base, d2tk_modmask_t mask, bool down)
{
const bool old_state = (base->keys.mod & mask) == mask;
@@ -982,6 +1016,28 @@ d2tk_base_get_keymask(d2tk_base_t *base, d2tk_keymask_t mask, bool clear)
}
+D2TK_API bool
+d2tk_base_get_keymask_prev(d2tk_base_t *base, d2tk_keymask_t mask)
+{
+ const bool old_state = (base->keys.mask_prev & mask) == mask;
+
+ return old_state;
+}
+
+D2TK_API bool
+d2tk_base_get_keymask_down(d2tk_base_t *base, d2tk_keymask_t mask)
+{
+ return !d2tk_base_get_keymask_prev(base, mask)
+ && d2tk_base_get_keymask(base, mask, false);
+}
+
+D2TK_API bool
+d2tk_base_get_keymask_up(d2tk_base_t *base, d2tk_keymask_t mask)
+{
+ return d2tk_base_get_keymask_prev(base, mask)
+ && !d2tk_base_get_keymask(base, mask, false);
+}
+
D2TK_API void
d2tk_base_set_dimensions(d2tk_base_t *base, d2tk_coord_t w, d2tk_coord_t h)
{
diff --git a/src/base_internal.h b/src/base_internal.h
index 31ad648..286bed5 100644
--- a/src/base_internal.h
+++ b/src/base_internal.h
@@ -74,6 +74,7 @@ struct _d2tk_base_t {
d2tk_coord_t dx;
d2tk_coord_t dy;
d2tk_butmask_t mask;
+ d2tk_butmask_t mask_prev;
} mouse;
struct {
@@ -88,6 +89,7 @@ struct _d2tk_base_t {
utf8_int32_t chars [32];
unsigned keymod;
d2tk_keymask_t mask;
+ d2tk_keymask_t mask_prev;
d2tk_modmask_t mod;
} keys;