[quadrapassel] quadrapassel: Add game controller support



commit 846b475402d91405197589670d26e9c20ed32ef0
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Sat Dec 2 13:44:09 2017 +0100

    quadrapassel: Add game controller support
    
    Allow to control the game with any plugged game controller. It currently
    uses only the buttons so a game controller with a directional pad is
    required as analog stick aren't supported.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=791129

 src/quadrapassel.vala |   87 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 87 insertions(+), 0 deletions(-)
---
diff --git a/src/quadrapassel.vala b/src/quadrapassel.vala
index 5ff79a6..6c19ba4 100644
--- a/src/quadrapassel.vala
+++ b/src/quadrapassel.vala
@@ -57,6 +57,8 @@ public class Quadrapassel : Gtk.Application
     private Gtk.CheckButton sound_toggle;
     private Gtk.ListStore controls_model;
 
+    private Manette.Monitor manette_monitor;
+
     private const GLib.ActionEntry[] action_entries =
     {
         { "new-game",      new_game_cb    },
@@ -192,6 +194,12 @@ public class Quadrapassel : Gtk.Application
 
         game_grid.attach (pause_play_button, 2, 16, 1, 2);
 
+        manette_monitor = new Manette.Monitor ();
+        manette_monitor.device_connected.connect (manette_device_connected_cb);
+        var manette_iterator = manette_monitor.iterate ();
+        Manette.Device manette_device = null;
+        while (manette_iterator.next (out manette_device))
+            manette_device_connected_cb (manette_device);
 
         history = new History (Path.build_filename (Environment.get_user_data_dir (), "quadrapassel", 
"history"));
         history.load ();
@@ -555,6 +563,85 @@ public class Quadrapassel : Gtk.Application
         window.destroy ();
     }
 
+    private void manette_device_connected_cb (Manette.Device manette_device)
+    {
+        manette_device.button_press_event.connect (manette_button_press_event_cb);
+        manette_device.button_release_event.connect (manette_button_release_event_cb);
+    }
+
+    private void manette_button_press_event_cb (Manette.Event event)
+    {
+        if (game == null)
+            return;
+
+        uint16 button;
+        if (!event.get_button (out button))
+            return;
+
+        if (button == InputEventCode.BTN_START || button == InputEventCode.BTN_SELECT)
+        {
+            if (!game.game_over)
+                game.paused = !game.paused;
+            return;
+        }
+
+        if (game.paused)
+            return;
+
+        if (button == InputEventCode.BTN_DPAD_LEFT)
+        {
+            game.move_left ();
+            return;
+        }
+        else if (button == InputEventCode.BTN_DPAD_RIGHT)
+        {
+            game.move_right ();
+            return;
+        }
+        else if (button == InputEventCode.BTN_A)
+        {
+            game.rotate_left ();
+            return;
+        }
+        else if (button == InputEventCode.BTN_B)
+        {
+            game.rotate_right ();
+            return;
+        }
+        else if (button == InputEventCode.BTN_DPAD_DOWN)
+        {
+            game.set_fast_forward (true);
+            return;
+        }
+        else if (button == InputEventCode.BTN_DPAD_UP)
+        {
+            game.drop ();
+            return;
+        }
+    }
+
+    private void manette_button_release_event_cb (Manette.Event event)
+    {
+        if (game == null)
+            return;
+
+        uint16 button;
+        if (!event.get_button (out button))
+            return;
+
+        if (button == InputEventCode.BTN_DPAD_LEFT ||
+            button == InputEventCode.BTN_DPAD_RIGHT)
+        {
+            game.stop_moving ();
+            return;
+        }
+        else if (button == InputEventCode.BTN_DPAD_DOWN)
+        {
+            game.set_fast_forward (false);
+            return;
+        }
+    }
+
     private bool key_press_event_cb (Gtk.Widget widget, Gdk.EventKey event)
     {
         var keyval = upper_key (event.keyval);


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