diff --git a/clutter/clutter/clutter-grab.h b/clutter/clutter/clutter-grab.h new file mode 100644 index 000000000..8c8704649 --- /dev/null +++ b/clutter/clutter/clutter-grab.h @@ -0,0 +1,38 @@ +/* + * Clutter. + * + * An OpenGL based 'interactive canvas' library. + * + * Copyright (C) 2021 Red Hat Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: Carlos Garnacho + */ + +#ifndef CLUTTER_GRAB_H +#define CLUTTER_GRAB_H + +#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +typedef struct _ClutterGrab ClutterGrab; + +CLUTTER_EXPORT +void clutter_grab_dismiss (ClutterGrab *grab); + +#endif /* CLUTTER_GRAB_H */ diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index 03a957065..e9354c488 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -52,6 +52,7 @@ #include "clutter-enum-types.h" #include "clutter-event-private.h" #include "clutter-frame-clock.h" +#include "clutter-grab.h" #include "clutter-id-pool.h" #include "clutter-input-device-private.h" #include "clutter-main.h" @@ -113,6 +114,8 @@ struct _ClutterStagePrivate gchar *title; ClutterActor *key_focused_actor; + ClutterGrab *topmost_grab; + GQueue *event_queue; GArray *paint_volume_stack; @@ -133,6 +136,14 @@ struct _ClutterStagePrivate guint actor_needs_immediate_relayout : 1; }; +struct _ClutterGrab +{ + ClutterStage *stage; + ClutterActor *actor; + ClutterGrab *prev; + ClutterGrab *next; +}; + enum { PROP_0, @@ -3625,3 +3636,54 @@ clutter_stage_pick_and_update_device (ClutterStage *stage, return new_actor; } + +ClutterGrab * +clutter_stage_grab (ClutterStage *stage, + ClutterActor *actor) +{ + ClutterStagePrivate *priv = stage->priv; + ClutterGrab *grab; + + g_return_val_if_fail (CLUTTER_IS_STAGE (stage), NULL); + g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), NULL); + + grab = g_new0 (ClutterGrab, 1); + grab->stage = stage; + grab->actor = actor; + grab->prev = NULL; + grab->next = priv->topmost_grab; + + if (priv->topmost_grab) + priv->topmost_grab->prev = grab; + + priv->topmost_grab = grab; + + return grab; +} + +void +clutter_grab_dismiss (ClutterGrab *grab) +{ + ClutterStagePrivate *priv; + ClutterGrab *prev, *next; + + g_return_if_fail (grab != NULL); + + priv = grab->stage->priv; + prev = grab->prev; + next = grab->next; + + if (prev) + prev->next = next; + if (next) + next->prev = prev; + + if (priv->topmost_grab == grab) + { + /* This is the active grab */ + g_assert (prev == NULL); + priv->topmost_grab = next; + } + + g_free (grab); +} diff --git a/clutter/clutter/clutter-stage.h b/clutter/clutter/clutter-stage.h index efb788e70..b45c50ccd 100644 --- a/clutter/clutter/clutter-stage.h +++ b/clutter/clutter/clutter-stage.h @@ -29,6 +29,7 @@ #endif #include +#include #include #include @@ -269,6 +270,10 @@ ClutterActor * clutter_stage_get_device_actor (ClutterStage *stage, ClutterInputDevice *device, ClutterEventSequence *sequence); +CLUTTER_EXPORT +ClutterGrab * clutter_stage_grab (ClutterStage *stage, + ClutterActor *actor); + G_END_DECLS #endif /* __CLUTTER_STAGE_H__ */ diff --git a/clutter/clutter/clutter.h b/clutter/clutter/clutter.h index 8eefead61..be788b9e5 100644 --- a/clutter/clutter/clutter.h +++ b/clutter/clutter/clutter.h @@ -65,6 +65,7 @@ #include "clutter-frame-clock.h" #include "clutter-frame.h" #include "clutter-gesture-action.h" +#include "clutter-grab.h" #include "clutter-grid-layout.h" #include "clutter-image.h" #include "clutter-input-device.h" diff --git a/clutter/clutter/meson.build b/clutter/clutter/meson.build index cd2c897a7..2b8764a0f 100644 --- a/clutter/clutter/meson.build +++ b/clutter/clutter/meson.build @@ -39,6 +39,7 @@ clutter_headers = [ 'clutter-frame-clock.h', 'clutter-frame.h', 'clutter-gesture-action.h', + 'clutter-grab.h', 'clutter-grid-layout.h', 'clutter-image.h', 'clutter-input-device.h',