[retro-gtk/pointer: 3/4] input: Add Pointer



commit 18dc3210b2b8d7c843fbfeec47e285aaef2a3ffb
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Tue Jul 25 12:10:30 2017 +0200

    input: Add Pointer
    
    This will be used to represent Libretro's pointer type from the mouse's
    pointer moving an a widget.

 retro-gtk/Makefile.am        |    1 +
 retro-gtk/input/pointer.vala |   90 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+), 0 deletions(-)
---
diff --git a/retro-gtk/Makefile.am b/retro-gtk/Makefile.am
index 344b4f9..9c0388d 100644
--- a/retro-gtk/Makefile.am
+++ b/retro-gtk/Makefile.am
@@ -37,6 +37,7 @@ libretro_gtk_la_SOURCES = \
        input/input-device-manager.vala \
        input/keyboard-state.vala \
        input/mouse.vala \
+       input/pointer.vala \
        input/retro-keyboard-key.c \
        input/virtual-gamepad.vala \
        \
diff --git a/retro-gtk/input/pointer.vala b/retro-gtk/input/pointer.vala
new file mode 100644
index 0000000..25b6391
--- /dev/null
+++ b/retro-gtk/input/pointer.vala
@@ -0,0 +1,90 @@
+// This file is part of retro-gtk. License: GPL-3.0+.
+
+public class Retro.Pointer : Object, InputDevice {
+       public CoreView core_view { get; construct; }
+       public bool snap_to_borders { set; get; }
+
+       private HashTable<uint?, bool?> button_state;
+       private bool inside;
+       private double pointer_x;
+       private double pointer_y;
+
+       public Pointer (CoreView core_view) {
+               Object (core_view: core_view);
+       }
+
+       construct {
+               core_view.button_press_event.connect (on_button_press_event);
+               core_view.button_release_event.connect (on_button_release_event);
+               core_view.motion_notify_event.connect (on_motion_notify_event);
+
+               button_state = new HashTable<uint?, bool?> (int_hash, int_equal);
+       }
+
+       public void poll () {}
+
+       public int16 get_input_state (DeviceType device, uint index, uint id) {
+               if (device != DeviceType.POINTER)
+                       return 0;
+
+               switch ((PointerId) id) {
+                       case PointerId.X:
+                               return axis_to_retro_axis (pointer_x);
+                       case PointerId.Y:
+                               return axis_to_retro_axis (pointer_y);
+                       case PointerId.PRESSED:
+                               return (inside || snap_to_borders) && get_button_state (1) ? 1 : 0;
+                       default:
+                               return 0;
+               }
+       }
+
+       public DeviceType get_device_type () {
+               return DeviceType.POINTER;
+       }
+
+       public uint64 get_device_capabilities () {
+               return 1 << DeviceType.POINTER;
+       }
+
+       private int16 axis_to_retro_axis (double value) {
+               if (value <= -1.0)
+                       return -int16.MAX;
+
+               if (value >= 1.0)
+                       return int16.MAX;
+
+               return (int16) (value * int16.MAX);
+       }
+
+       private bool on_button_press_event (Gtk.Widget source, Gdk.EventButton event) {
+               inside = core_view.get_coordinates_on_display (event.x, event.y, out pointer_x, out 
pointer_y);
+
+               if (button_state.contains (event.button))
+                       button_state.replace (event.button, true);
+               else
+                       button_state.insert (event.button, true);
+
+               return false;
+       }
+
+       private bool on_button_release_event (Gtk.Widget source, Gdk.EventButton event) {
+               if (button_state.contains (event.button))
+                       button_state.replace (event.button, false);
+
+               return false;
+       }
+
+       private bool on_motion_notify_event (Gtk.Widget source, Gdk.EventMotion event) {
+               inside = core_view.get_coordinates_on_display (event.x, event.y, out pointer_x, out 
pointer_y);
+
+               return !inside;
+       }
+
+       public bool get_button_state (uint button) {
+               if (button_state.contains (button))
+                       return button_state.lookup (button);
+
+               return false;
+       }
+}


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