Files
yoctor-layers/meta-st/meta-st-openstlinux/recipes-samples/event-gtk-player/files/0007-TOUCH-EVENT-add-touch-event.patch
2024-07-11 14:16:35 +02:00

198 lines
6.6 KiB
Diff

From 1b69798661d39d5bea14479a4a9b963cbc5f6ef4 Mon Sep 17 00:00:00 2001
From: Christophe Priouzeau <christophe.priouzeau@foss.st.com>
Date: Thu, 30 Mar 2023 10:43:12 +0200
Subject: [PATCH 7/7] TOUCH EVENT: add touch event
Signed-off-by: Christophe Priouzeau <christophe.priouzeau@foss.st.com>
---
main.c | 90 ++++++++++++++++++++++++++++++++---
1 file changed, 84 insertions(+), 6 deletions(-)
diff --git a/main.c b/main.c
index b262fb7..f3c7444 100644
--- a/main.c
+++ b/main.c
@@ -16,6 +16,9 @@
static gchar *graph = NULL;
static gchar *shader_file = NULL;
static gboolean nofullscreen = FALSE;
+static gint window_width = 480;
+static gint window_height = 272;
+static guint32 last_touch_tap = 0;
static GOptionEntry entries[] = {
{"nofullscreen", 'F', 0, G_OPTION_ARG_NONE, &nofullscreen,
@@ -56,6 +59,7 @@ msg_state_changed (GstBus * bus, GstMessage * message, gpointer user_data)
{
const GstStructure *s;
DemoApp *d = user_data;
+ (void)bus;
s = gst_message_get_structure (message);
@@ -123,21 +127,71 @@ gstreamer_bus_callback (GstBus * bus, GstMessage * message, void *data)
break;
default:
+/* const GstStructure *s = gst_message_get_structure (message);*/
+/* gchar *str;*/
+/* str = gst_structure_to_string (s);*/
+/* g_print ("BUS %s: %s\n", GST_MESSAGE_TYPE_NAME (message), str);*/
+/* g_free (str);*/
/* unhandled message */
break;
}
return TRUE;
}
+
+
+static gboolean
+touch_notify_event_cb (GtkWidget * widget, GdkEventTouch * eventTouch,
+ gpointer data)
+{
+ DemoApp *d = data;
+ (void)widget;
+ guint32 diff;
+ GstState actual_state;
+
+ if (eventTouch->type == GDK_TOUCH_END || eventTouch->type == GDK_TOUCH_CANCEL) {
+ if (last_touch_tap == 0) {
+ last_touch_tap = eventTouch->time;
+ gst_element_get_state(d->pipeline, &actual_state, NULL, -1);
+ if (actual_state == GST_STATE_PAUSED)
+ gst_element_set_state (d->pipeline, GST_STATE_PLAYING);
+ else
+ gst_element_set_state (d->pipeline, GST_STATE_PAUSED);
+ } else {
+ diff = eventTouch->time - last_touch_tap;
+ if (last_touch_tap != 0) {
+ last_touch_tap = eventTouch->time;
+ if (diff < 600) {
+ //g_print("--> DOUBLE TAP\n");
+ gst_element_set_state (d->pipeline, GST_STATE_NULL);
+ g_main_loop_quit (d->loop);
+ exit(1); //force to quit application
+ } else {
+ gst_element_get_state(d->pipeline, &actual_state, NULL, -1);
+ if (actual_state == GST_STATE_PAUSED)
+ gst_element_set_state (d->pipeline, GST_STATE_PLAYING);
+ else
+ gst_element_set_state (d->pipeline, GST_STATE_PAUSED);
+ //g_print("--> SIMPLE TAP\n");
+ }
+ //g_print("--> BEGIN diff = %d\n", diff);
+ }
+ }
+ }
+
+ /* We've handled the event, stop processing */
+ return TRUE;
+}
+
static gboolean
button_notify_event_cb (GtkWidget * widget, GdkEventButton * eventButton,
gpointer data)
{
DemoApp *d = data;
+ (void)widget;
if (eventButton->type == GDK_BUTTON_PRESS) {
GstState actual_state;
-
gst_element_get_state(d->pipeline, &actual_state, NULL, -1);
if (actual_state == GST_STATE_PAUSED)
gst_element_set_state (d->pipeline, GST_STATE_PLAYING);
@@ -146,11 +200,11 @@ button_notify_event_cb (GtkWidget * widget, GdkEventButton * eventButton,
} else if (eventButton->type == GDK_2BUTTON_PRESS) {
g_main_loop_quit (d->loop);
}
-
/* We've handled the event, stop processing */
return TRUE;
}
+
static void
build_window (DemoApp * d)
{
@@ -186,9 +240,10 @@ build_window (DemoApp * d)
g_object_unref(provider);
gtk_widget_set_name(d->window_widget, "transparent_bg");
-
sink = gst_bin_get_by_name (GST_BIN (d->pipeline), "gtkwsink");
- if (!sink && !g_strcmp0 (G_OBJECT_TYPE_NAME (d->pipeline), "GstPlayBin")) {
+ if (!sink &&
+ (!g_strcmp0 (G_OBJECT_TYPE_NAME (d->pipeline), "GstPlayBin") ||
+ !g_strcmp0 (G_OBJECT_TYPE_NAME (d->pipeline), "GstPlayBin3"))) {
g_object_get (d->pipeline, "video-sink", &sink, NULL);
if (sink && g_strcmp0 (G_OBJECT_TYPE_NAME (sink), "GstGtkWaylandSink") != 0
&& GST_IS_BIN (sink)) {
@@ -205,6 +260,8 @@ build_window (DemoApp * d)
gtk_widget_set_vexpand (video_widget, TRUE);
g_signal_connect (video_widget, "button-press-event",
G_CALLBACK (button_notify_event_cb), d);
+ g_signal_connect (video_widget, "touch-event",
+ G_CALLBACK (touch_notify_event_cb), d);
// Override the system settings to match other demos more closely
g_object_set (gtk_settings_get_default (),
@@ -214,6 +271,8 @@ build_window (DemoApp * d)
gtk_container_add(GTK_CONTAINER (d->window_widget), video_widget);
gtk_widget_show_all (d->window_widget);
+/* gtk_widget_set_can_focus(video_widget, TRUE);*/
+/* gtk_widget_grab_focus (video_widget);*/
g_object_unref (video_widget);
gst_object_unref (sink);
@@ -248,8 +307,26 @@ keyboard_cb (const gchar key_input, gpointer user_data)
gst_element_get_state(d->pipeline, &actual_state, NULL, -1);
if (actual_state == GST_STATE_PLAYING)
gst_element_set_state (d->pipeline, GST_STATE_PAUSED);
- else
+ else {
+/* switch (actual_state){*/
+/* case GST_STATE_VOID_PENDING:*/
+/* g_print("keyboard_cb state: GST_STATE_VOID_PENDING\n");*/
+/* break;*/
+/* case GST_STATE_NULL:*/
+/* g_print("keyboard_cb state: GST_STATE_NULL\n");*/
+/* break;*/
+/* case GST_STATE_READY:*/
+/* g_print("keyboard_cb state: GST_STATE_READY\n");*/
+/* break;*/
+/* case GST_STATE_PAUSED:*/
+/* g_print("keyboard_cb state: GST_STATE_PAUSED\n");*/
+/* break;*/
+/* case GST_STATE_PLAYING:*/
+/* g_print("keyboard_cb state: GST_STATE_PLAYING\n");*/
+/* break;*/
+/* }*/
gst_element_set_state (d->pipeline, GST_STATE_PLAYING);
+ }
break;
}
case 'q':
@@ -265,6 +342,7 @@ io_callback (GIOChannel * io, GIOCondition condition, gpointer data)
{
gchar in;
GError *error = NULL;
+ (void)condition;
switch (g_io_channel_read_chars (io, &in, 1, NULL, &error)) {
case G_IO_STATUS_NORMAL:
@@ -327,7 +405,7 @@ main (int argc, char **argv)
d->argv = argv;
d->current_uri = 1;
- d->pipeline = gst_parse_launch ("playbin video-sink=gtkwaylandsink", &error);
+ d->pipeline = gst_parse_launch ("playbin3 video-sink='gtkwaylandsink name=gtkwsink' ", &error);
if (error)
goto out;
--
2.25.1