Add shell_button_box_fake_release

The application menu code wants to do a popup after a given timeout
while holding.  We can implement that by adding a function to
manually break the grab held by the button box.

Freeze+thaw around the hover and pressed property notification on leave
since handlers may want to depend on the pressed state on a hover
transition.
This commit is contained in:
Colin Walters 2009-09-01 14:14:19 -04:00
parent 926643b025
commit 0a17a28608
2 changed files with 32 additions and 1 deletions

View File

@ -89,9 +89,13 @@ shell_button_box_enter_event (ClutterActor *actor,
if (!shell_button_box_contains (box, event->source))
return TRUE;
set_hover (box, TRUE);
g_object_freeze_notify (G_OBJECT (actor));
if (box->priv->held)
set_pressed (box, TRUE);
set_hover (box, TRUE);
g_object_thaw_notify (G_OBJECT (actor));
return TRUE;
}
@ -159,6 +163,31 @@ shell_button_box_button_release_event (ClutterActor *actor,
return TRUE;
}
/**
* shell_button_box_fake_release:
* @box:
*
* If this button box is holding a pointer grab, this function will
* will ungrab it, and reset the pressed state. The effect is
* similar to if the user had released the mouse button, but without
* emitting the activate signal.
*
* This function is useful if for example you want to do something after the user
* is holding the mouse button for a given period of time, breaking the
* grab.
*/
void
shell_button_box_fake_release (ShellButtonBox *box)
{
if (!box->priv->held)
return;
box->priv->held = FALSE;
clutter_ungrab_pointer ();
set_pressed (box, FALSE);
}
static void
shell_button_box_set_property(GObject *object,
guint prop_id,

View File

@ -30,4 +30,6 @@ struct _ShellButtonBoxClass
GType shell_button_box_get_type (void) G_GNUC_CONST;
void shell_button_box_fake_release (ShellButtonBox *box);
#endif /* __SHELL_BUTTON_BOX_H__ */