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:
parent
f8742fa050
commit
baed3f8a69
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user