[gnome-games/wip/aplazas/781572-remove-vala-macro: 11/14] gamepad: Port LinuxRawGamepadMonitor fallback to C



commit e5b09627a1cf4d720fac5dfb438147323bf8eb06
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Tue Apr 25 19:47:48 2017 +0200

    gamepad: Port LinuxRawGamepadMonitor fallback to C
    
    This will help to port part of the gamepad handling to C to avoid using
    the Vala preprocessor.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=781572

 src/Makefile.am                                    |    2 +-
 .../linux/linux-raw-gamepad-monitor-fallback.c     |  156 ++++++++++++++++++++
 .../linux/linux-raw-gamepad-monitor-fallback.vala  |   53 -------
 3 files changed, 157 insertions(+), 54 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index ad20cec..5cebdbe 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -166,7 +166,7 @@ gnome_games_SOURCES += \
        $(NULL)
 else
 gnome_games_SOURCES += \
-       gamepad/linux/linux-raw-gamepad-monitor-fallback.vala \
+       gamepad/linux/linux-raw-gamepad-monitor-fallback.c \
        $(NULL)
 endif
 endif
diff --git a/src/gamepad/linux/linux-raw-gamepad-monitor-fallback.c 
b/src/gamepad/linux/linux-raw-gamepad-monitor-fallback.c
new file mode 100644
index 0000000..61b183d
--- /dev/null
+++ b/src/gamepad/linux/linux-raw-gamepad-monitor-fallback.c
@@ -0,0 +1,156 @@
+// This file is part of GNOME Games. License: GPL-3.0+.
+
+#include "linux-raw-gamepad-monitor.h"
+
+#include "linux-raw-gamepad.h"
+#include "../raw-gamepad-monitor.h"
+
+struct _GamesLinuxRawGamepadMonitor {
+  GObject parent_instance;
+
+  GHashTable *raw_gamepads;
+};
+
+static void games_raw_gamepad_monitor_interface_init (GamesRawGamepadMonitorInterface *interface);
+
+G_DEFINE_TYPE_WITH_CODE (GamesLinuxRawGamepadMonitor, games_linux_raw_gamepad_monitor, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (GAMES_TYPE_RAW_GAMEPAD_MONITOR,
+                                                games_raw_gamepad_monitor_interface_init))
+
+/* Private */
+
+typedef void (*GamesRawGamepadCallback) (GamesRawGamepad *raw_gamepad, void *user_data);
+typedef struct {
+  GamesRawGamepadCallback callback;
+  gpointer callback_target;
+} ForeachGamepadData;
+
+static void
+foreach_gamepad_do (gpointer key,
+                    gpointer value,
+                    gpointer data)
+{
+  ForeachGamepadData *callback_data;
+  GamesRawGamepad *raw_gamepad;
+
+  callback_data = (ForeachGamepadData *) data;
+  raw_gamepad = (GamesRawGamepad *) value;
+
+  g_return_if_fail (raw_gamepad != NULL);
+
+  callback_data->callback (raw_gamepad, callback_data->callback_target);
+}
+
+static void
+foreach_gamepad (GamesRawGamepadMonitor  *base,
+                 GamesRawGamepadCallback  callback,
+                 gpointer                 callback_target)
+{
+  GamesLinuxRawGamepadMonitor *self;
+  ForeachGamepadData data;
+
+  self = GAMES_LINUX_RAW_GAMEPAD_MONITOR (base);
+
+  g_return_if_fail (base != NULL);
+  g_return_if_fail (callback != NULL);
+
+  data.callback = callback;
+  data.callback_target = callback_target;
+  g_hash_table_foreach (self->raw_gamepads, foreach_gamepad_do, &data);
+}
+
+static GamesLinuxRawGamepadMonitor *
+games_linux_raw_gamepad_monitor_new (void)
+{
+  GamesLinuxRawGamepadMonitor *self = NULL;
+  GError *error = NULL;
+  static const gchar *directory = "/dev/input";
+  GDir *dir;
+  const gchar *name = NULL;
+  gchar *path;
+  GamesLinuxRawGamepad *raw_gamepad = NULL;
+
+
+  self = (GamesLinuxRawGamepadMonitor *) g_object_new (GAMES_TYPE_LINUX_RAW_GAMEPAD_MONITOR, NULL);
+  self->raw_gamepads = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+
+  // Coldplug gamepads
+  dir = g_dir_open (directory, (guint) 0, &error);
+  if (G_UNLIKELY (error != NULL)) {
+    g_debug ("%s", error->message);
+    g_error_free (error);
+
+    return self;
+  }
+
+  while ((name = g_dir_read_name (dir)) != NULL) {
+    path = g_build_filename (directory, name, NULL);
+    raw_gamepad = games_linux_raw_gamepad_new (path, &error);
+    if (G_UNLIKELY (error != NULL)) {
+      if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NXIO))
+        g_debug ("Failed to open gamepad %s: %s", path, error->message);
+
+      g_error_free (error);
+      g_free (path);
+      error = NULL;
+
+      continue;
+    }
+
+    g_free (path);
+
+    g_assert (raw_gamepad != NULL);
+
+    g_hash_table_insert (self->raw_gamepads, g_strdup (name), raw_gamepad);
+    g_signal_emit_by_name (self, "gamepad-plugged", raw_gamepad);
+  }
+
+  g_dir_close (dir);
+
+  return self;
+}
+
+/* Public */
+
+GamesLinuxRawGamepadMonitor *
+games_linux_raw_gamepad_monitor_get_instance (void)
+{
+  static GamesLinuxRawGamepadMonitor *instance = NULL;
+
+  if (instance == NULL)
+    instance = games_linux_raw_gamepad_monitor_new ();
+
+  return g_object_ref (instance);
+}
+
+/* Type */
+
+static void
+games_linux_raw_gamepad_monitor_finalize (GObject *object)
+{
+  GamesLinuxRawGamepadMonitor *self = GAMES_LINUX_RAW_GAMEPAD_MONITOR (object);
+
+  if (self->raw_gamepads != NULL)
+    g_hash_table_unref (self->raw_gamepads);
+
+  G_OBJECT_CLASS (games_linux_raw_gamepad_monitor_parent_class)->finalize (object);
+}
+
+static void
+games_linux_raw_gamepad_monitor_class_init (GamesLinuxRawGamepadMonitorClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = games_linux_raw_gamepad_monitor_finalize;
+}
+
+static void
+games_raw_gamepad_monitor_interface_init (GamesRawGamepadMonitorInterface *interface)
+{
+  interface->foreach_gamepad = foreach_gamepad;
+}
+
+static void
+games_linux_raw_gamepad_monitor_init (GamesLinuxRawGamepadMonitor *self)
+{
+}


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