[retro-gtk/pointer: 1/2] input: Add Pointer
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk/pointer: 1/2] input: Add Pointer
- Date: Sun, 23 Jul 2017 07:01:38 +0000 (UTC)
commit 8bd5bd0012764a3c3f2492138e5a73850607fef0
Author: Adrien Plazas <kekun plazas laposte net>
Date: Sun Jul 23 08:59:24 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 d74108a..2898bd2 100644
--- a/retro-gtk/Makefile.am
+++ b/retro-gtk/Makefile.am
@@ -39,6 +39,7 @@ libretro_gtk_la_SOURCES = \
input/keyboard.vala \
input/keyboard-state.vala \
input/mouse.vala \
+ input/pointer.vala \
input/virtual-gamepad.vala \
\
loop/main-loop.vala \
diff --git a/retro-gtk/input/pointer.vala b/retro-gtk/input/pointer.vala
new file mode 100644
index 0000000..44f1849
--- /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 Gtk.Widget widget { get; construct; }
+
+ private HashTable<uint?, bool?> button_state;
+ private int16 pointer_x;
+ private int16 pointer_y;
+
+ public Pointer (Gtk.Widget widget) {
+ Object (widget: widget);
+ }
+
+ construct {
+ widget.button_press_event.connect (on_button_press_event);
+ widget.button_release_event.connect (on_button_release_event);
+ widget.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 pointer_x;
+ case PointerId.Y:
+ return pointer_y;
+ case PointerId.PRESSED:
+ return 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 bool parse_position (Gtk.Widget source, double event_x, double event_y) {
+ var w = source.get_allocated_width ();
+ var h = source.get_allocated_height ();
+
+ if (!((0 <= event_x <= w) && (0 <= event_y <= h)))
+ return true;
+
+ pointer_x = (int16) ((event_x * 2.0 - w) / w * int16.MAX);
+ pointer_y = (int16) ((event_y * 2.0 - h) / h * int16.MAX);
+
+ return false;
+ }
+
+ private bool on_button_press_event (Gtk.Widget source, Gdk.EventButton event) {
+ if (parse_position (widget, event.x, event.y))
+ return true;
+
+ 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) {
+ return parse_position (widget, event.x, event.y);
+ }
+
+ 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]