shell-util: Add helper to hide actors from pick
At times it is desireable to hide actors from being picked even with a mode of CLUTTER_PICK_ALL. Currently we use a pattern of clutter_actor_hide(); clutter_stage_get_actor_at_pos(); clutter_actor_show(); in these cases, which gets hideous if the actor we want to exclude from the pick is located in another module. A more elegant solution is to connect a handler to the ::pick signal, which stops further emission. Credit for the idea goes to Owen Taylor. https://bugzilla.gnome.org/show_bug.cgi?id=634560
This commit is contained in:
parent
e5a802bf99
commit
1c8955b34a
@ -399,3 +399,43 @@ shell_util_icon_from_string (const char *string, GError **error)
|
|||||||
{
|
{
|
||||||
return g_icon_new_for_string (string, error);
|
return g_icon_new_for_string (string, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
stop_pick (ClutterActor *actor,
|
||||||
|
const ClutterColor *color)
|
||||||
|
{
|
||||||
|
g_signal_stop_emission_by_name (actor, "pick");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shell_util_set_hidden_from_pick:
|
||||||
|
* @actor: A #ClutterActor
|
||||||
|
* @hidden: Whether @actor should be hidden from pick
|
||||||
|
*
|
||||||
|
* If @hidden is %TRUE, hide @actor from pick even with a mode of
|
||||||
|
* %CLUTTER_PICK_ALL; if @hidden is %FALSE, unhide @actor.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
shell_util_set_hidden_from_pick (ClutterActor *actor,
|
||||||
|
gboolean hidden)
|
||||||
|
{
|
||||||
|
gpointer existing_handler_data;
|
||||||
|
|
||||||
|
existing_handler_data = g_object_get_data (G_OBJECT (actor),
|
||||||
|
"shell-stop-pick");
|
||||||
|
if (hidden)
|
||||||
|
{
|
||||||
|
if (existing_handler_data != NULL)
|
||||||
|
return;
|
||||||
|
g_signal_connect (actor, "pick", G_CALLBACK (stop_pick), NULL);
|
||||||
|
g_object_set_data (G_OBJECT (actor),
|
||||||
|
"shell-stop-pick", GUINT_TO_POINTER (1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (existing_handler_data == NULL)
|
||||||
|
return;
|
||||||
|
g_signal_handlers_disconnect_by_func (actor, stop_pick, NULL);
|
||||||
|
g_object_set_data (G_OBJECT (actor), "shell-stop-pick", NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -4,12 +4,14 @@
|
|||||||
#define __SHELL_UTIL_H__
|
#define __SHELL_UTIL_H__
|
||||||
|
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
char *shell_util_get_label_for_uri (const char *text_uri);
|
char *shell_util_get_label_for_uri (const char *text_uri);
|
||||||
GIcon *shell_util_get_icon_for_uri (const char *text_uri);
|
GIcon *shell_util_get_icon_for_uri (const char *text_uri);
|
||||||
GIcon *shell_util_icon_from_string (const char *string, GError **error);
|
GIcon *shell_util_icon_from_string (const char *string, GError **error);
|
||||||
|
void shell_util_set_hidden_from_pick (ClutterActor *actor, gboolean hidden);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user