[retro-gtk/wip/aplazas/core-view: 6/8] core-view: Add pointer support



commit e0aa8559d72ffa367025ffb2db12985399029f03
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Fri Aug 11 08:41:31 2017 +0200

    core-view: Add pointer support

 retro-gtk/retro-core-view-extern.c |   48 +++++++++++++++++++++++++++++++++++-
 retro-gtk/retro-core-view.vala     |    6 +++-
 retro-gtk/video/cairo-display.vala |   11 ++++++++
 3 files changed, 63 insertions(+), 2 deletions(-)
---
diff --git a/retro-gtk/retro-core-view-extern.c b/retro-gtk/retro-core-view-extern.c
index 441ac51..76c6694 100644
--- a/retro-gtk/retro-core-view-extern.c
+++ b/retro-gtk/retro-core-view-extern.c
@@ -55,6 +55,18 @@ get_input_state (GHashTable *table,
   return g_hash_table_contains (table, &input);
 }
 
+static gint16
+axis_to_retro_axis (gdouble value)
+{
+  if (value <= -1.0)
+    return -G_MAXINT16;
+
+  if (value >= 1.0)
+    return G_MAXINT16;
+
+  return (gint16) (value * G_MAXINT16);
+}
+
 static void
 recenter_pointer (RetroCoreView *self)
 {
@@ -184,6 +196,15 @@ retro_core_view_on_button_press_event (RetroCoreView  *self,
                             event->window,
                             (GdkEvent *) event);
   }
+  else {
+    set_input_pressed (self->mouse_button_state, event->button);
+    self->pointer_is_on_display =
+      retro_cairo_display_get_coordinates_on_display (self->display,
+                                                      event->x,
+                                                      event->y,
+                                                      &self->pointer_x,
+                                                      &self->pointer_y);
+  }
 
   return FALSE;
 }
@@ -235,6 +256,15 @@ retro_core_view_on_motion_notify_event (RetroCoreView  *self,
       recenter_pointer (self);
     }
   }
+  else {
+    self->pointer_is_on_display =
+      retro_cairo_display_get_coordinates_on_display (self->display,
+                                                      event->x,
+                                                      event->y,
+                                                      &self->pointer_x,
+                                                      &self->pointer_y);
+
+  }
 
   return FALSE;
 }
@@ -310,6 +340,21 @@ retro_core_view_get_input_state (RetroCoreView   *self,
     default:
       return 0;
     }
+  case RETRO_DEVICE_TYPE_POINTER:
+    switch (id) {
+    case RETRO_POINTER_ID_X:
+      return axis_to_retro_axis (self->pointer_x);
+    case RETRO_POINTER_ID_Y:
+      return axis_to_retro_axis (self->pointer_y);
+    case RETRO_POINTER_ID_PRESSED:
+      if (!self->pointer_is_on_display ||
+          retro_core_view_get_snap_pointer_to_borders (self))
+        return 0;
+
+      return retro_core_view_get_mouse_button_state (self, 1) ? 1 : 0;
+    default:
+      return 0;
+    }
   default:
     return 0;
   }
@@ -322,7 +367,8 @@ retro_core_view_get_device_capabilities (RetroCoreView *self)
   g_return_val_if_fail (self != NULL, 0);
 
   return 1 << RETRO_DEVICE_TYPE_JOYPAD |
-         1 << RETRO_DEVICE_TYPE_MOUSE;
+         1 << RETRO_DEVICE_TYPE_MOUSE |
+         1 << RETRO_DEVICE_TYPE_POINTER;
 }
 
 /* Public */
diff --git a/retro-gtk/retro-core-view.vala b/retro-gtk/retro-core-view.vala
index 742b5cd..fc663b8 100644
--- a/retro-gtk/retro-core-view.vala
+++ b/retro-gtk/retro-core-view.vala
@@ -16,9 +16,10 @@ public class Retro.CoreView : Gtk.EventBox {
                default = false;
        }
 
+       public bool snap_pointer_to_borders { set; get; }
 
        private Core core;
-       private CairoDisplay display;
+       internal CairoDisplay display;
 
        internal HashTable<uint?, bool?> key_state;
        internal HashTable<uint?, bool?> mouse_button_state;
@@ -30,6 +31,9 @@ public class Retro.CoreView : Gtk.EventBox {
        internal int screen_center_y;
        internal int position_on_grab_x;
        internal int position_on_grab_y;
+       internal bool pointer_is_on_display;
+       internal double pointer_x;
+       internal double pointer_y;
 
        construct {
                can_focus = true;
diff --git a/retro-gtk/video/cairo-display.vala b/retro-gtk/video/cairo-display.vala
index 5302b78..19c271a 100644
--- a/retro-gtk/video/cairo-display.vala
+++ b/retro-gtk/video/cairo-display.vala
@@ -39,6 +39,17 @@ public class Retro.CairoDisplay : Gtk.DrawingArea {
                queue_draw ();
        }
 
+       public bool get_coordinates_on_display (double widget_x, double widget_y, out double display_x, out 
double display_y) {
+               double w, h, x, y;
+               get_video_box (out w, out h, out x, out y);
+
+               // Return coordinates as a [-1.0,1.0] scale, (0.0,0.0) is the center.
+               display_x = ((widget_x-x) * 2.0 - w) / w;
+               display_y = ((widget_y-y) * 2.0 - h) / h;
+
+               return (-1.0 <= display_x <= 1.0) && (-1.0 <= display_y <= 1.0);
+       }
+
        private void on_video_output (uint8[] data, uint width, uint height, size_t pitch, PixelFormat 
pixel_format, float aspect_ratio) {
                this.aspect_ratio = aspect_ratio;
                pixbuf = gdk_pixbuf_new_from_video (data, width, height, pitch, pixel_format);


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