mirror of
https://github.com/brl/mutter.git
synced 2024-11-29 03:20:46 -05:00
clutter: Make ClutterGrab a GObject
We'll want to add notifications on it, make it a GObject to allow that. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3420>
This commit is contained in:
parent
02bb9651e1
commit
b154fddd0f
45
clutter/clutter/clutter-grab-private.h
Normal file
45
clutter/clutter/clutter-grab-private.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Clutter.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "clutter-grab.h"
|
||||||
|
#include "clutter-stage.h"
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
struct _ClutterGrab
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
ClutterStage *stage;
|
||||||
|
|
||||||
|
ClutterActor *actor;
|
||||||
|
gboolean owns_actor;
|
||||||
|
|
||||||
|
ClutterGrab *prev;
|
||||||
|
ClutterGrab *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
ClutterGrab * clutter_grab_new (ClutterStage *stage,
|
||||||
|
ClutterActor *actor,
|
||||||
|
gboolean owns_actor);
|
||||||
|
|
||||||
|
G_END_DECLS
|
75
clutter/clutter/clutter-grab.c
Normal file
75
clutter/clutter/clutter-grab.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Clutter.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "clutter-grab-private.h"
|
||||||
|
|
||||||
|
G_DEFINE_FINAL_TYPE (ClutterGrab, clutter_grab, G_TYPE_OBJECT)
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_grab_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
clutter_grab_dismiss (CLUTTER_GRAB (object));
|
||||||
|
G_OBJECT_CLASS (clutter_grab_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_grab_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
ClutterGrab *grab = CLUTTER_GRAB (object);
|
||||||
|
|
||||||
|
if (grab->owns_actor)
|
||||||
|
g_clear_pointer (&grab->actor, clutter_actor_destroy);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (clutter_grab_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_grab_class_init (ClutterGrabClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->dispose = clutter_grab_dispose;
|
||||||
|
object_class->finalize = clutter_grab_finalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_grab_init (ClutterGrab *grab)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ClutterGrab *
|
||||||
|
clutter_grab_new (ClutterStage *stage,
|
||||||
|
ClutterActor *actor,
|
||||||
|
gboolean owns_actor)
|
||||||
|
{
|
||||||
|
ClutterGrab *grab;
|
||||||
|
|
||||||
|
grab = g_object_new (CLUTTER_TYPE_GRAB, NULL);
|
||||||
|
grab->stage = stage;
|
||||||
|
|
||||||
|
grab->actor = actor;
|
||||||
|
if (owns_actor)
|
||||||
|
grab->owns_actor = TRUE;
|
||||||
|
|
||||||
|
return grab;
|
||||||
|
}
|
@ -29,20 +29,15 @@
|
|||||||
|
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
|
|
||||||
#define CLUTTER_TYPE_GRAB (clutter_grab_get_type ())
|
#include "clutter-macros.h"
|
||||||
typedef struct _ClutterGrab ClutterGrab;
|
#include "clutter-enums.h"
|
||||||
|
|
||||||
|
#define CLUTTER_TYPE_GRAB (clutter_grab_get_type ())
|
||||||
CLUTTER_EXPORT
|
CLUTTER_EXPORT
|
||||||
GType clutter_grab_get_type (void) G_GNUC_CONST;
|
G_DECLARE_FINAL_TYPE (ClutterGrab, clutter_grab, CLUTTER, GRAB, GObject)
|
||||||
|
|
||||||
CLUTTER_EXPORT
|
CLUTTER_EXPORT
|
||||||
void clutter_grab_dismiss (ClutterGrab *grab);
|
void clutter_grab_dismiss (ClutterGrab *grab);
|
||||||
|
|
||||||
CLUTTER_EXPORT
|
CLUTTER_EXPORT
|
||||||
ClutterGrabState clutter_grab_get_seat_state (ClutterGrab *grab);
|
ClutterGrabState clutter_grab_get_seat_state (ClutterGrab *grab);
|
||||||
|
|
||||||
CLUTTER_EXPORT
|
|
||||||
ClutterGrab * clutter_grab_ref (ClutterGrab *grab);
|
|
||||||
|
|
||||||
CLUTTER_EXPORT
|
|
||||||
void clutter_grab_unref (ClutterGrab *grab);
|
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
#include "clutter/clutter-event-private.h"
|
#include "clutter/clutter-event-private.h"
|
||||||
#include "clutter/clutter-frame-clock.h"
|
#include "clutter/clutter-frame-clock.h"
|
||||||
#include "clutter/clutter-frame.h"
|
#include "clutter/clutter-frame.h"
|
||||||
#include "clutter/clutter-grab.h"
|
#include "clutter/clutter-grab-private.h"
|
||||||
#include "clutter/clutter-input-device-private.h"
|
#include "clutter/clutter-input-device-private.h"
|
||||||
#include "clutter/clutter-input-only-actor.h"
|
#include "clutter/clutter-input-only-actor.h"
|
||||||
#include "clutter/clutter-main.h"
|
#include "clutter/clutter-main.h"
|
||||||
@ -138,18 +138,6 @@ typedef struct _ClutterStagePrivate
|
|||||||
guint actor_needs_immediate_relayout : 1;
|
guint actor_needs_immediate_relayout : 1;
|
||||||
} ClutterStagePrivate;
|
} ClutterStagePrivate;
|
||||||
|
|
||||||
struct _ClutterGrab
|
|
||||||
{
|
|
||||||
grefcount ref_count;
|
|
||||||
ClutterStage *stage;
|
|
||||||
|
|
||||||
ClutterActor *actor;
|
|
||||||
gboolean owns_actor;
|
|
||||||
|
|
||||||
ClutterGrab *prev;
|
|
||||||
ClutterGrab *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
@ -3882,44 +3870,6 @@ clutter_stage_notify_grab (ClutterStage *stage,
|
|||||||
clutter_stage_notify_grab_on_key_focus (stage, cur_actor, old_actor);
|
clutter_stage_notify_grab_on_key_focus (stage, cur_actor, old_actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClutterGrab *
|
|
||||||
clutter_grab_ref (ClutterGrab *grab)
|
|
||||||
{
|
|
||||||
g_ref_count_inc (&grab->ref_count);
|
|
||||||
return grab;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
clutter_grab_unref (ClutterGrab *grab)
|
|
||||||
{
|
|
||||||
if (g_ref_count_dec (&grab->ref_count))
|
|
||||||
{
|
|
||||||
clutter_grab_dismiss (grab);
|
|
||||||
g_free (grab);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
G_DEFINE_BOXED_TYPE (ClutterGrab, clutter_grab,
|
|
||||||
clutter_grab_ref, clutter_grab_unref)
|
|
||||||
|
|
||||||
static ClutterGrab *
|
|
||||||
clutter_grab_new (ClutterStage *stage,
|
|
||||||
ClutterActor *actor,
|
|
||||||
gboolean owns_actor)
|
|
||||||
{
|
|
||||||
ClutterGrab *grab;
|
|
||||||
|
|
||||||
grab = g_new0 (ClutterGrab, 1);
|
|
||||||
g_ref_count_init (&grab->ref_count);
|
|
||||||
grab->stage = stage;
|
|
||||||
|
|
||||||
grab->actor = actor;
|
|
||||||
if (owns_actor)
|
|
||||||
grab->owns_actor = TRUE;
|
|
||||||
|
|
||||||
return grab;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ClutterGrab *
|
static ClutterGrab *
|
||||||
clutter_stage_grab_full (ClutterStage *stage,
|
clutter_stage_grab_full (ClutterStage *stage,
|
||||||
ClutterActor *actor,
|
ClutterActor *actor,
|
||||||
|
@ -118,6 +118,7 @@ clutter_sources = [
|
|||||||
'clutter-frame-clock.c',
|
'clutter-frame-clock.c',
|
||||||
'clutter-frame.c',
|
'clutter-frame.c',
|
||||||
'clutter-gesture-action.c',
|
'clutter-gesture-action.c',
|
||||||
|
'clutter-grab.c',
|
||||||
'clutter-graphene.c',
|
'clutter-graphene.c',
|
||||||
'clutter-grid-layout.c',
|
'clutter-grid-layout.c',
|
||||||
'clutter-image.c',
|
'clutter-image.c',
|
||||||
|
@ -178,7 +178,7 @@ meta_window_drag_finalize (GObject *object)
|
|||||||
|
|
||||||
hide_tile_preview (window_drag);
|
hide_tile_preview (window_drag);
|
||||||
g_clear_pointer (&window_drag->handler, clutter_actor_destroy);
|
g_clear_pointer (&window_drag->handler, clutter_actor_destroy);
|
||||||
g_clear_pointer (&window_drag->grab, clutter_grab_unref);
|
g_clear_object (&window_drag->grab);
|
||||||
g_clear_object (&window_drag->effective_grab_window);
|
g_clear_object (&window_drag->effective_grab_window);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_window_drag_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_window_drag_parent_class)->finalize (object);
|
||||||
|
@ -237,7 +237,7 @@ grab_under_pointer (void)
|
|||||||
event_log_compare ((EventLog *) &grab_log, data.events);
|
event_log_compare ((EventLog *) &grab_log, data.events);
|
||||||
|
|
||||||
clutter_grab_dismiss (grab);
|
clutter_grab_dismiss (grab);
|
||||||
clutter_grab_unref (grab);
|
g_clear_object (&grab);
|
||||||
event_log_compare ((EventLog *) &ungrab_log, data.events);
|
event_log_compare ((EventLog *) &ungrab_log, data.events);
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -264,7 +264,7 @@ grab_under_pointers_parent (void)
|
|||||||
event_log_compare ((EventLog *) &grab_log, data.events);
|
event_log_compare ((EventLog *) &grab_log, data.events);
|
||||||
|
|
||||||
clutter_grab_dismiss (grab);
|
clutter_grab_dismiss (grab);
|
||||||
clutter_grab_unref (grab);
|
g_clear_object (&grab);
|
||||||
event_log_compare ((EventLog *) &ungrab_log, data.events);
|
event_log_compare ((EventLog *) &ungrab_log, data.events);
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -295,7 +295,7 @@ grab_outside_pointer (void)
|
|||||||
event_log_compare ((EventLog *) &grab_log, data.events);
|
event_log_compare ((EventLog *) &grab_log, data.events);
|
||||||
|
|
||||||
clutter_grab_dismiss (grab);
|
clutter_grab_dismiss (grab);
|
||||||
clutter_grab_unref (grab);
|
g_clear_object (&grab);
|
||||||
event_log_compare ((EventLog *) &ungrab_log, data.events);
|
event_log_compare ((EventLog *) &ungrab_log, data.events);
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -320,7 +320,7 @@ grab_stage (void)
|
|||||||
event_log_compare ((EventLog *) &grab_log, data.events);
|
event_log_compare ((EventLog *) &grab_log, data.events);
|
||||||
|
|
||||||
clutter_grab_dismiss (grab);
|
clutter_grab_dismiss (grab);
|
||||||
clutter_grab_unref (grab);
|
g_clear_object (&grab);
|
||||||
event_log_compare ((EventLog *) &ungrab_log, data.events);
|
event_log_compare ((EventLog *) &ungrab_log, data.events);
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -364,11 +364,11 @@ grab_stack_1 (void)
|
|||||||
|
|
||||||
/* Dismiss orderly */
|
/* Dismiss orderly */
|
||||||
clutter_grab_dismiss (grab2);
|
clutter_grab_dismiss (grab2);
|
||||||
clutter_grab_unref (grab2);
|
g_clear_object (&grab2);
|
||||||
event_log_compare ((EventLog *) &ungrab2_log, data.events);
|
event_log_compare ((EventLog *) &ungrab2_log, data.events);
|
||||||
|
|
||||||
clutter_grab_dismiss (grab1);
|
clutter_grab_dismiss (grab1);
|
||||||
clutter_grab_unref (grab1);
|
g_clear_object (&grab1);
|
||||||
event_log_compare ((EventLog *) &ungrab1_log, data.events);
|
event_log_compare ((EventLog *) &ungrab1_log, data.events);
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -414,11 +414,11 @@ grab_stack_2 (void)
|
|||||||
|
|
||||||
/* Dismiss orderly */
|
/* Dismiss orderly */
|
||||||
clutter_grab_dismiss (grab2);
|
clutter_grab_dismiss (grab2);
|
||||||
clutter_grab_unref (grab2);
|
g_clear_object (&grab2);
|
||||||
event_log_compare ((EventLog *) &ungrab2_log, data.events);
|
event_log_compare ((EventLog *) &ungrab2_log, data.events);
|
||||||
|
|
||||||
clutter_grab_dismiss (grab1);
|
clutter_grab_dismiss (grab1);
|
||||||
clutter_grab_unref (grab1);
|
g_clear_object (&grab1);
|
||||||
event_log_compare ((EventLog *) &ungrab1_log, data.events);
|
event_log_compare ((EventLog *) &ungrab1_log, data.events);
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -462,11 +462,11 @@ grab_unordered_ungrab_1 (void)
|
|||||||
|
|
||||||
/* Dismiss disorderly */
|
/* Dismiss disorderly */
|
||||||
clutter_grab_dismiss (grab1);
|
clutter_grab_dismiss (grab1);
|
||||||
clutter_grab_unref (grab1);
|
g_clear_object (&grab1);
|
||||||
event_log_compare ((EventLog *) &ungrab1_log, data.events);
|
event_log_compare ((EventLog *) &ungrab1_log, data.events);
|
||||||
|
|
||||||
clutter_grab_dismiss (grab2);
|
clutter_grab_dismiss (grab2);
|
||||||
clutter_grab_unref (grab2);
|
g_clear_object (&grab2);
|
||||||
event_log_compare ((EventLog *) &ungrab2_log, data.events);
|
event_log_compare ((EventLog *) &ungrab2_log, data.events);
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -508,11 +508,11 @@ grab_unordered_ungrab_2 (void)
|
|||||||
|
|
||||||
/* Dismiss disorderly */
|
/* Dismiss disorderly */
|
||||||
clutter_grab_dismiss (grab1);
|
clutter_grab_dismiss (grab1);
|
||||||
clutter_grab_unref (grab1);
|
g_clear_object (&grab1);
|
||||||
event_log_compare ((EventLog *) &ungrab1_log, data.events);
|
event_log_compare ((EventLog *) &ungrab1_log, data.events);
|
||||||
|
|
||||||
clutter_grab_dismiss (grab2);
|
clutter_grab_dismiss (grab2);
|
||||||
clutter_grab_unref (grab2);
|
g_clear_object (&grab2);
|
||||||
event_log_compare ((EventLog *) &ungrab2_log, data.events);
|
event_log_compare ((EventLog *) &ungrab2_log, data.events);
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -533,7 +533,7 @@ grab_key_focus_in_grab (void)
|
|||||||
g_assert_true (clutter_actor_has_key_focus (data.b));
|
g_assert_true (clutter_actor_has_key_focus (data.b));
|
||||||
|
|
||||||
clutter_grab_dismiss (grab);
|
clutter_grab_dismiss (grab);
|
||||||
clutter_grab_unref (grab);
|
g_clear_object (&grab);
|
||||||
g_assert_true (clutter_actor_has_key_focus (data.b));
|
g_assert_true (clutter_actor_has_key_focus (data.b));
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -554,7 +554,7 @@ grab_key_focus_outside_grab (void)
|
|||||||
g_assert_false (clutter_actor_has_key_focus (data.b));
|
g_assert_false (clutter_actor_has_key_focus (data.b));
|
||||||
|
|
||||||
clutter_grab_dismiss (grab);
|
clutter_grab_dismiss (grab);
|
||||||
clutter_grab_unref (grab);
|
g_clear_object (&grab);
|
||||||
g_assert_true (clutter_actor_has_key_focus (data.b));
|
g_assert_true (clutter_actor_has_key_focus (data.b));
|
||||||
|
|
||||||
test_data_shutdown (&data);
|
test_data_shutdown (&data);
|
||||||
@ -643,7 +643,7 @@ grab_input_only (void)
|
|||||||
g_main_context_iteration (NULL, TRUE);
|
g_main_context_iteration (NULL, TRUE);
|
||||||
event_log_compare ((EventLog *) &grab2_log, data.events);
|
event_log_compare ((EventLog *) &grab2_log, data.events);
|
||||||
|
|
||||||
clutter_grab_unref (grab);
|
g_clear_object (&grab);
|
||||||
event_log_compare ((EventLog *) &grab3_log, data.events);
|
event_log_compare ((EventLog *) &grab3_log, data.events);
|
||||||
|
|
||||||
clutter_virtual_input_device_notify_button (pointer,
|
clutter_virtual_input_device_notify_button (pointer,
|
||||||
|
Loading…
Reference in New Issue
Block a user