[gnome-games/wip/aplazas/gamepad: 5/5] gamepad: Make Gamepad derivable



commit b5191a90272b4e6ffc2710de78690ea2465be320
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Sun May 14 08:16:08 2017 +0200

    gamepad: Make Gamepad derivable
    
    This is needed to make LinuxRawGamepad a subclass of Gamepad and drop
    the now barely useful RawGamepad type.

 src/gamepad/gamepad.c |   42 ++++++++++++++++++++++--------------------
 src/gamepad/gamepad.h |    7 ++++++-
 2 files changed, 28 insertions(+), 21 deletions(-)
---
diff --git a/src/gamepad/gamepad.c b/src/gamepad/gamepad.c
index 3827bf6..9de53ce 100644
--- a/src/gamepad/gamepad.c
+++ b/src/gamepad/gamepad.c
@@ -8,14 +8,13 @@
 #include "gamepad-mapping.h"
 #include "gamepad-mappings-manager.h"
 
-struct _GamesGamepad {
-  GObject parent_instance;
-
+typedef struct
+{
   GamesRawGamepad *raw_gamepad;
   GamesGamepadMapping *mapping;
-};
+} GamesGamepadPrivate;
 
-G_DEFINE_TYPE (GamesGamepad, games_gamepad, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_PRIVATE (GamesGamepad, games_gamepad, G_TYPE_OBJECT)
 
 enum {
   SIGNAL_EVENT,
@@ -61,6 +60,7 @@ static void
 map_button_event (GamesGamepad            *self,
                   GamesEventGamepadButton *games_event)
 {
+  GamesGamepadPrivate *priv = games_gamepad_get_instance_private (self);
   GamesGamepadInput destination;
   GamesEvent *mapped_event;
   guint signal;
@@ -100,6 +100,7 @@ static void
 map_axis_event (GamesGamepad          *self,
                 GamesEventGamepadAxis *games_event)
 {
+  GamesGamepadPrivate *priv = games_gamepad_get_instance_private (self);
   GamesGamepadInput destination;
   GamesEvent *mapped_event;
   guint signal;
@@ -136,6 +137,7 @@ static void
 map_hat_event (GamesGamepad         *self,
                GamesEventGamepadHat *games_event)
 {
+  GamesGamepadPrivate *priv = games_gamepad_get_instance_private (self);
   GamesGamepadInput destination;
   GamesEvent *mapped_event;
   guint signal;
@@ -201,15 +203,14 @@ on_event (GamesRawGamepad *sender,
           GamesEvent      *event,
           gpointer         data)
 {
-  GamesGamepad *self;
-
-  self = GAMES_GAMEPAD (data);
+  GamesGamepad *self = GAMES_GAMEPAD (data);
+  GamesGamepadPrivate *priv = games_gamepad_get_instance_private (self);
 
   g_return_if_fail (self != NULL);
 
   g_signal_emit (self, signals[SIGNAL_EVENT], 0, event);
 
-  if (self->mapping == NULL)
+  if (priv->mapping == NULL)
     forward_event (self, event);
   else
     map_event (self, event);
@@ -229,7 +230,8 @@ GamesGamepad *
 games_gamepad_new (GamesRawGamepad  *raw_gamepad,
                    GError          **error)
 {
-  GamesGamepad *self = NULL;
+  GamesGamepad *self = GAMES_GAMEPAD (data);
+  GamesGamepadPrivate *priv = games_gamepad_get_instance_private (self);
   const gchar *guid;
   GamesGamepadMappingsManager *mappings_manager;
   const gchar *mapping_string;
@@ -237,16 +239,14 @@ games_gamepad_new (GamesRawGamepad  *raw_gamepad,
 
   g_return_val_if_fail (raw_gamepad != NULL, NULL);
 
-  self = (GamesGamepad*) g_object_new (GAMES_TYPE_GAMEPAD, NULL);
-
-  self->raw_gamepad = g_object_ref (raw_gamepad);
+  priv->raw_gamepad = g_object_ref (raw_gamepad);
   guid = games_raw_gamepad_get_guid (raw_gamepad);
   mappings_manager = games_gamepad_mappings_manager_get_instance ();
   mapping_string = games_gamepad_mappings_manager_get_mapping (mappings_manager, guid);
 
   g_object_unref (mappings_manager);
 
-  self->mapping = games_gamepad_mapping_new_from_sdl_string (mapping_string, &inner_error);
+  priv->mapping = games_gamepad_mapping_new_from_sdl_string (mapping_string, &inner_error);
   if (G_UNLIKELY (inner_error != NULL)) {
     g_debug ("%s", inner_error->message);
     g_clear_error (&inner_error);
@@ -268,12 +268,14 @@ games_gamepad_new (GamesRawGamepad  *raw_gamepad,
 
 /* Type */
 
-static void finalize (GObject *obj) {
-  GamesGamepad *self;
-  self = G_TYPE_CHECK_INSTANCE_CAST (obj, GAMES_TYPE_GAMEPAD, GamesGamepad);
-  g_object_unref (self->raw_gamepad);
-  g_object_unref (self->mapping);
-  G_OBJECT_CLASS (games_gamepad_parent_class)->finalize (obj);
+static void finalize (GObject *object) {
+  GamesGamepad *self = (GamesGamepad *)object;
+  GamesGamepadPrivate *priv = games_gamepad_get_instance_private (self);
+
+  g_object_unref (priv->raw_gamepad);
+  g_object_unref (priv->mapping);
+
+  G_OBJECT_CLASS (games_gamepad_parent_class)->finalize (object);
 }
 
 static void games_gamepad_class_init (GamesGamepadClass *klass) {
diff --git a/src/gamepad/gamepad.h b/src/gamepad/gamepad.h
index cb8c1a0..7053159 100644
--- a/src/gamepad/gamepad.h
+++ b/src/gamepad/gamepad.h
@@ -10,7 +10,12 @@ G_BEGIN_DECLS
 
 #define GAMES_TYPE_GAMEPAD (games_gamepad_get_type())
 
-G_DECLARE_FINAL_TYPE (GamesGamepad, games_gamepad, GAMES, GAMEPAD, GObject)
+G_DECLARE_DERIVABLE_TYPE (GamesGamepad, games_gamepad, GAMES, GAMEPAD, GObject)
+
+struct _GamesGamepadClass
+{
+  GObjectClass parent;
+};
 
 GamesGamepad *games_gamepad_new (GamesRawGamepad  *raw_gamepad,
                                  GError          **error);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]