[retro-gtk/wip/aplazas/core-view: 6/8] core-view: Add pointer support
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk/wip/aplazas/core-view: 6/8] core-view: Add pointer support
- Date: Wed, 30 Aug 2017 10:52:45 +0000 (UTC)
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]