[retro-gtk/pointer: 3/4] input: Add Pointer
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk/pointer: 3/4] input: Add Pointer
- Date: Sat, 29 Jul 2017 11:58:04 +0000 (UTC)
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]