1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-11-29 11:56:15 +02:00

eeshow/gui/input.c (input_update): update hovering after coordinate changes

E.g., when zooming in or out.
This commit is contained in:
Werner Almesberger 2016-08-18 13:12:09 -03:00
parent f8742fa050
commit baed3f8a69
2 changed files with 72 additions and 18 deletions

View File

@ -69,7 +69,7 @@ static const char *state(void)
} }
/* ----- Mouse button ------------------------------------------------------ */ /* ----- Shared operations ------------------------------------------------- */
static bool begin_drag(const GdkEventMotion *event) static bool begin_drag(const GdkEventMotion *event)
@ -88,11 +88,76 @@ static bool begin_drag(const GdkEventMotion *event)
} }
static gboolean motion_notify_event(GtkWidget *widget, GdkEventMotion *event, static void hover_consider(int x, int y)
gpointer data)
{ {
const struct input *old_sp = sp; const struct input *old_sp = sp;
assert(sp->state == input_idle);
if (sp->ops->hover_begin && sp->ops->hover_begin(sp->user, x, y))
sp->state = input_hovering;
assert(sp == old_sp);
}
static void hover_update(int x, int y)
{
const struct input *old_sp = sp;
assert(sp->state == input_hovering);
if (!sp->ops->hover_update)
return;
/*
* Caution: hover_update may switch input layers. If this happens,
* hovering was already ended when cleaning up the old input layer.
*/
if (sp->ops->hover_update(sp->user, x, y))
return;
if (sp != old_sp)
return;
sp->state = sp->state == input_hovering ? input_idle : input_clicking;
if (sp->ops->hover_end)
sp->ops->hover_end(sp->user);
}
/* ----- Indirect update --------------------------------------------------- */
/*
* Geometry changes may require a reassessment of the hover situation. This is
* roughly equivalent to what we would do on a mouse movement over distance
* zero.
*/
void input_update(void)
{
switch (sp->state) {
case input_idle:
hover_consider(curr_x, curr_y);
break;
case input_hovering:
hover_update(curr_x, curr_y);
break;
case input_clicking:
case input_ignoring:
case input_hovering_down:
case input_dragging:
break;
default:
abort();
}
}
/* ----- Mouse button ------------------------------------------------------ */
static gboolean motion_notify_event(GtkWidget *widget, GdkEventMotion *event,
gpointer data)
{
curr_x = event->x; curr_x = event->x;
curr_y = event->y; curr_y = event->y;
@ -103,10 +168,7 @@ static gboolean motion_notify_event(GtkWidget *widget, GdkEventMotion *event,
switch (sp->state) { switch (sp->state) {
case input_idle: case input_idle:
if (sp->ops->hover_begin && hover_consider(event->x, event->y);
sp->ops->hover_begin(sp->user, event->x, event->y))
sp->state = input_hovering;
assert(sp == old_sp);
break; break;
case input_clicking: case input_clicking:
begin_drag(event); begin_drag(event);
@ -121,17 +183,7 @@ static gboolean motion_notify_event(GtkWidget *widget, GdkEventMotion *event,
} }
/* fall through */ /* fall through */
case input_hovering: case input_hovering:
if (!sp->ops->hover_update) hover_update(event->x, event->y);
break;
/* Caution: hover_update may switch input layers */
if (!sp->ops->hover_update(sp->user, event->x, event->y) &&
sp == old_sp) {
sp->state = sp->state == input_hovering ? input_idle :
input_clicking;
if (sp->ops->hover_end)
sp->ops->hover_end(sp->user);
}
break; break;
case input_dragging: case input_dragging:
if (sp->ops->drag_move) if (sp->ops->drag_move)

View File

@ -45,6 +45,8 @@ struct input_ops {
bool input_accept(void *user, int x, int y); bool input_accept(void *user, int x, int y);
void input_update(void);
void input_push(const struct input_ops *ops, void *user); void input_push(const struct input_ops *ops, void *user);
void input_pop(void); void input_pop(void);
void input_setup(GtkWidget *da); void input_setup(GtkWidget *da);