[quadrapassel] quadrapassel: Add game controller support
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [quadrapassel] quadrapassel: Add game controller support
- Date: Sun, 3 Dec 2017 12:02:18 +0000 (UTC)
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]