[retro-gtk/wip/aplazas/demo] Add org.gnome.RetroGtk.Demo



commit adf6f48c08e5f380787e4c8d762ca3f34d7e7b5b
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Tue May 9 11:07:31 2017 +0200

    Add org.gnome.RetroGtk.Demo
    
    Add the org.gnome.RetroGtk.Demo flatpak-builder manifest and a demo,
    allowing to test retro-gtk interactively with a testing Libretro core.

 .editorconfig                                |   36 ++++++
 Makefile.am                                  |    2 +-
 configure.ac                                 |    4 +
 demos/Makefile.am                            |   69 ++++++++++
 demos/retro-gtk-demo-window.c                |   55 ++++++++
 demos/retro-gtk-demo-window.h                |   19 +++
 demos/retro-gtk-demo-window.ui               |   15 +++
 demos/retro-gtk-demo.c                       |  173 ++++++++++++++++++++++++++
 demos/retro-gtk-demo.gresource.xml           |    7 +
 flatpak/libretro-cores/libretro-samples.json |   23 ++++
 flatpak/libretro-cores/samples-Makefile      |   13 ++
 flatpak/org.gnome.RetroGtk.Demo.json         |   65 ++++++++++
 flatpak/retro-gtk-demo-samples-test          |    2 +
 retro-gtk/retro-environment.c                |   10 +-
 14 files changed, 488 insertions(+), 5 deletions(-)
---
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..5c9f919
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,36 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+
+[*.vala]
+indent_size = 4
+tab_size = 4
+indent_style = tab
+
+[*.{c,h}]
+indent_size = 2
+tab_size = 2
+indent_style = space
+
+[*.{ui,xml,modules}]
+indent_size = 2
+tab_size = 2
+indent_style = space
+
+[*.py]
+indent_size = 4
+tab_size = 4
+indent_style = space
+
+[*.{ac,am,mk}]
+indent_size = 8
+tab_size = 8
+indent_style = tab
+
+[*.sh]
+indent_size = 8
+tab_size = 8
+indent_style = space
diff --git a/Makefile.am b/Makefile.am
index 02b3f72..9a23d7c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,7 +2,7 @@
 
 NULL =
 
-SUBDIRS = retro-gtk po
+SUBDIRS = retro-gtk demos po
 
 dist_doc_DATA = \
        README \
diff --git a/configure.ac b/configure.ac
index d40e67e..4f1a5bb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -14,6 +14,9 @@ AM_PROG_AR
 
 AM_PROG_VALAC
 
+# GResource
+AC_PATH_PROG(GLIB_COMPILE_RESOURCES, glib-compile-resources)
+
 GOBJECT_INTROSPECTION_CHECK([0.6.7])
 
 dnl ***************************************************************************
@@ -48,6 +51,7 @@ AC_SUBST(retro_gtk_pkg_modules)
 
 AC_OUTPUT([
 Makefile
+demos/Makefile
 retro-gtk/retro-gtk-0.10.pc
 retro-gtk/Makefile
 po/Makefile.in])
diff --git a/demos/Makefile.am b/demos/Makefile.am
new file mode 100644
index 0000000..888b96a
--- /dev/null
+++ b/demos/Makefile.am
@@ -0,0 +1,69 @@
+NULL =
+
+bin_PROGRAMS = retro-gtk-demo
+
+BUILT_SOURCES = \
+       retro-gtk-demo-resources.c \
+       retro-gtk-demo-resources.h \
+       $(NULL)
+
+retro_gtk_demo_SOURCES = \
+       retro-gtk-demo.c \
+       retro-gtk-demo-window.c \
+       $(BUILT_SOURCES) \
+       $(NULL)
+
+retro_gtk_demo_CFLAGS = \
+       $(RETRO_GTK_CFLAGS) \
+       $(GAMEPADS_CFLAGS) \
+       $(UDEV_CFLAGS) \
+       -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+       -DGAMES_PLUGINS_DIR=\"$(libdir)/gnome-games/plugins\" \
+       $(NULL)
+
+retro_gtk_demo_CPPFLAGS = \
+       -I$(top_srcdir) \
+       -I$(top_builddir)/retro-gtk \
+       -I$(top_srcdir)/retro-gtk \
+       -DRETRO_GTK_USE_UNSTABLE_API \
+       $(NULL)
+
+retro_gtk_demo_DEPENDENCIES = \
+       $(top_builddir)/retro-gtk/libretro-gtk.la \
+       $(NULL)
+
+retro_gtk_demo_LDADD = \
+       $(RETRO_GTK_LIBS) \
+       $(top_builddir)/retro-gtk/libretro-gtk.la \
+       $(NULL)
+
+gresource = $(srcdir)/retro-gtk-demo.gresource.xml
+
+resource_files = $(shell \
+       $(GLIB_COMPILE_RESOURCES) \
+       --sourcedir=$(srcdir) \
+       --generate-dependencies \
+       $(gresource))
+
+retro-gtk-demo-resources.c: $(gresource) $(resource_files)
+       $(AM_V_GEN) \
+       $(GLIB_COMPILE_RESOURCES) \
+               --target=$@ \
+               --sourcedir=$(srcdir) \
+               --generate-source \
+               --c-name retro_gtk_demo \
+               $<
+
+retro-gtk-demo-resources.h: $(gresource) $(resource_files)
+       $(AM_V_GEN) \
+       $(GLIB_COMPILE_RESOURCES) \
+               --target=$@ \
+               --sourcedir=$(srcdir) \
+               --generate-header \
+               --c-name retro_gtk_demo \
+               $<
+
+CLEANFILES = $(BUILT_SOURCES)
+EXTRA_DIST = $(resource_files) $(gresource)
+
+-include $(top_srcdir)/git.mk
diff --git a/demos/retro-gtk-demo-window.c b/demos/retro-gtk-demo-window.c
new file mode 100644
index 0000000..5629462
--- /dev/null
+++ b/demos/retro-gtk-demo-window.c
@@ -0,0 +1,55 @@
+// This file is part of retro-gtk. License: GPLv3
+
+#include "retro-gtk-demo-window.h"
+
+struct _RetroTesterWindow
+{
+  GtkApplicationWindow parent_instance;
+
+  GtkBuilder *builder;
+  RetroCairoDisplay *display;
+};
+
+G_DEFINE_TYPE (RetroTesterWindow, retro_tester_window, GTK_TYPE_APPLICATION_WINDOW)
+
+#define UI_RESOURCE "/org/gnome/retro-gtk/tester/retro-tester-window.ui"
+
+RetroTesterWindow *
+retro_tester_window_new (RetroCore *core)
+{
+  RetroTesterWindow *self;
+
+  g_return_val_if_fail (core != NULL, NULL);
+
+  self = g_object_new (RETRO_TYPE_TESTER_WINDOW, NULL);
+
+  retro_cairo_display_set_core (self->display, core);
+
+  return self;
+}
+
+static void
+retro_tester_window_finalize (GObject *object)
+{
+  RetroTesterWindow *self = RETRO_TESTER_WINDOW (object);
+
+  G_OBJECT_CLASS (retro_tester_window_parent_class)->finalize (object);
+}
+
+static void
+retro_tester_window_class_init (RetroTesterWindowClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->finalize = retro_tester_window_finalize;
+
+  gtk_widget_class_set_template_from_resource (widget_class, UI_RESOURCE);
+  gtk_widget_class_bind_template_child (widget_class, RetroTesterWindow, display);
+}
+
+static void
+retro_tester_window_init (RetroTesterWindow *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
+}
diff --git a/demos/retro-gtk-demo-window.h b/demos/retro-gtk-demo-window.h
new file mode 100644
index 0000000..cbeb181
--- /dev/null
+++ b/demos/retro-gtk-demo-window.h
@@ -0,0 +1,19 @@
+// This file is part of retro-gtk. License: GPLv3
+
+#ifndef RETRO_TESTER_WINDOW_H
+#define RETRO_TESTER_WINDOW_H
+
+#include <retro-gtk/retro-gtk.h>
+
+G_BEGIN_DECLS
+
+#define RETRO_TYPE_TESTER_WINDOW (retro_tester_window_get_type())
+
+G_DECLARE_FINAL_TYPE (RetroTesterWindow, retro_tester_window, RETRO, TESTER_WINDOW, GtkApplicationWindow)
+
+RetroTesterWindow *retro_tester_window_new (RetroCore *core);
+
+G_END_DECLS
+
+#endif /* RETRO_TESTER_WINDOW_H */
+
diff --git a/demos/retro-gtk-demo-window.ui b/demos/retro-gtk-demo-window.ui
new file mode 100644
index 0000000..2790d8e
--- /dev/null
+++ b/demos/retro-gtk-demo-window.ui
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="3.16"/>
+  <template class="RetroTesterWindow" parent="GtkApplicationWindow">
+    <property name="can_focus">False</property>
+    <property name="default_width">640</property>
+    <property name="default_height">480</property>
+    <property name="show_menubar">False</property>
+    <child>
+      <object class="RetroCairoDisplay" id="display">
+        <property name="visible">True</property>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/demos/retro-gtk-demo.c b/demos/retro-gtk-demo.c
new file mode 100644
index 0000000..26d7437
--- /dev/null
+++ b/demos/retro-gtk-demo.c
@@ -0,0 +1,173 @@
+// This file is part of retro-gtk. License: GPLv3
+
+#include <gtk/gtk.h>
+#include <retro-gtk/retro-gtk.h>
+#include "retro-gtk-demo-window.h"
+
+#define RETRO_TYPE_TESTER_APPLICATION (retro_tester_application_get_type())
+
+G_DECLARE_FINAL_TYPE (RetroTesterApplication, retro_tester_application, RETRO, TESTER_APPLICATION, 
GtkApplication)
+
+struct _RetroTesterApplication
+{
+  GtkApplication parent_instance;
+
+  RetroCore *core;
+  RetroMainLoop *loop;
+  RetroPaPlayer *pa_player;
+};
+
+G_DEFINE_TYPE (RetroTesterApplication, retro_tester_application, GTK_TYPE_APPLICATION)
+
+static void
+retro_tester_open (GApplication  *application,
+                   GFile        **files,
+                   gint           n_files,
+                   const gchar   *hint)
+{
+  RetroTesterApplication *self;
+  char *module_path;
+  gchar *game_path;
+  RetroSystemInfo system_info = { 0 };
+  RetroGameInfo game_info = { 0 };
+  GError *error = NULL;
+
+  self = RETRO_TESTER_APPLICATION (application);
+
+  if (n_files < 1)
+    return;
+
+  if (!g_file_query_exists (files[0], NULL))
+    return;
+
+  module_path = g_file_get_path (files[0]);
+  self->core = retro_core_new (module_path);
+  g_free (module_path);
+
+  if (self->core == NULL)
+    return;
+
+  g_signal_emit_by_name (self->core, "init");
+
+  self->pa_player = retro_pa_player_new ();
+  retro_pa_player_set_core (self->pa_player, self->core);
+
+  if (n_files == 1) {
+    retro_core_prepare (self->core);
+    g_application_activate (application);
+
+    return;
+  }
+
+  if (!g_file_query_exists (files[1], NULL))
+    return;
+
+  retro_core_get_system_info (self->core, &system_info);
+
+  if (system_info.need_fullpath) {
+    game_path = g_file_get_path (files[1]);
+    retro_game_info_destroy (&game_info);
+    retro_game_info_init (&game_info, game_path);
+  }
+  else {
+    game_path = g_file_get_path (files[1]);
+    retro_game_info_destroy (&game_info);
+    retro_game_info_init_with_data (&game_info, game_path, &error);
+    if (G_UNLIKELY (error != NULL)) {
+      retro_game_info_destroy (&game_info);
+      g_free (game_path);
+      g_clear_error (&error);
+
+      return;
+    }
+  }
+
+  if (!retro_core_load_game (self->core, &game_info))
+    return;
+
+  retro_game_info_destroy (&game_info);
+
+  // TODO Use all files.
+
+  g_application_activate (application);
+}
+
+static RetroTesterApplication *
+retro_tester_application_new (void)
+{
+  return g_object_new (RETRO_TYPE_TESTER_APPLICATION, NULL);
+}
+
+static void
+retro_tester_application_finalize (GObject *object)
+{
+  RetroTesterApplication *self = RETRO_TESTER_APPLICATION (object);
+
+  if (self->core != NULL)
+    g_object_unref (self->core);
+
+  if (self->loop != NULL)
+    g_object_unref (self->loop);
+
+  if (self->pa_player != NULL)
+    g_object_unref (self->pa_player);
+
+  G_OBJECT_CLASS (retro_tester_application_parent_class)->finalize (object);
+}
+
+
+static void
+retro_tester_activate (GApplication* application)
+{
+  RetroTesterApplication *self;
+  GtkSettings *settings;
+  RetroTesterWindow *window;
+
+  self = RETRO_TESTER_APPLICATION (application);
+
+  settings = gtk_settings_get_default ();
+  g_object_set (G_OBJECT (settings), "gtk-application-prefer-dark-theme", TRUE, NULL);
+
+  window = retro_tester_window_new (self->core);
+  gtk_widget_show (GTK_WIDGET (window));
+  gtk_application_add_window (GTK_APPLICATION (application), GTK_WINDOW (window));
+
+  self->loop = retro_main_loop_new (self->core);
+  retro_main_loop_start (self->loop);
+}
+
+static void
+retro_tester_application_class_init (RetroTesterApplicationClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GApplicationClass *application_class = G_APPLICATION_CLASS (klass);
+
+  object_class->finalize = retro_tester_application_finalize;
+
+  application_class->activate = retro_tester_activate;
+  application_class->open = retro_tester_open;
+}
+
+static void
+retro_tester_application_init (RetroTesterApplication *self)
+{
+  g_application_set_application_id (G_APPLICATION (self), "org.gnome.RetroGtkTester");
+  g_application_set_flags (G_APPLICATION (self), G_APPLICATION_NON_UNIQUE | G_APPLICATION_HANDLES_OPEN);
+}
+
+gint
+main (gint   argc,
+      gchar *argv[])
+{
+  RetroTesterApplication *app;
+  int status;
+
+  g_set_prgname ("retro-gtk-tester");
+  g_set_application_name ("org.gnome.RetroGtkTester");
+
+  app = retro_tester_application_new();
+  status = g_application_run (G_APPLICATION (app), argc, argv);
+  g_object_unref (app);
+
+  return status;
+}
diff --git a/demos/retro-gtk-demo.gresource.xml b/demos/retro-gtk-demo.gresource.xml
new file mode 100644
index 0000000..d7868a1
--- /dev/null
+++ b/demos/retro-gtk-demo.gresource.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/retro-gtk/tester">
+    <file preprocess="xml-stripblanks">retro-gtk-demo-window.ui</file>
+  </gresource>
+</gresources>
+
diff --git a/flatpak/libretro-cores/libretro-samples.json b/flatpak/libretro-cores/libretro-samples.json
new file mode 100644
index 0000000..8efe460
--- /dev/null
+++ b/flatpak/libretro-cores/libretro-samples.json
@@ -0,0 +1,23 @@
+        {
+            "name": "libretro-samples",
+            "no-autogen": true,
+            "make-args": [
+                "--makefile=Makefile",
+                "prefix=/app"
+            ],
+            "make-install-args": [
+                "--makefile=Makefile",
+                "prefix=/app"
+            ],
+            "sources": [
+                {
+                    "type": "git",
+                    "url": "https://github.com/libretro/libretro-samples.git";
+                },
+                {
+                    "type": "file",
+                    "path": "libretro-cores/samples-Makefile",
+                    "dest-filename": "Makefile"
+                }
+            ]
+        }
diff --git a/flatpak/libretro-cores/samples-Makefile b/flatpak/libretro-cores/samples-Makefile
new file mode 100644
index 0000000..d06f421
--- /dev/null
+++ b/flatpak/libretro-cores/samples-Makefile
@@ -0,0 +1,13 @@
+NULL=
+
+CORES= \
+       tests/test/test_libretro.so \
+       $(NULL)
+
+all: tests/test/test_libretro.so
+
+tests/test/test_libretro.so:
+       make -C $(@D)
+
+install: $(CORES)
+       install -Dp -m755 tests/test/test_libretro.so $(DESTDIR)$(prefix)/lib/libretro/test_libretro.so
diff --git a/flatpak/org.gnome.RetroGtk.Demo.json b/flatpak/org.gnome.RetroGtk.Demo.json
new file mode 100644
index 0000000..088daf9
--- /dev/null
+++ b/flatpak/org.gnome.RetroGtk.Demo.json
@@ -0,0 +1,65 @@
+{
+    "app-id": "org.gnome.RetroGtk.Demo",
+    "runtime": "org.gnome.Platform",
+    "runtime-version": "master",
+    "sdk": "org.gnome.Sdk",
+    "command": "retro-gtk-demo-samples-test",
+    "tags": ["nightly"],
+    "desktop-file-name-prefix": "(Nightly) ",
+    "finish-args": [
+        /* X11 + XShm access */
+        "--share=ipc", "--socket=x11",
+        /* Wayland access */
+        "--socket=wayland",
+        /* PulseAudio access */
+        "--device=dri", "--socket=pulseaudio",
+        /* Needed to find the ROMs */
+        "--filesystem=home:ro"
+    ],
+    "build-options" : {
+        "cflags": "-O2 -g",
+        "cxxflags": "-O2 -g"
+    },
+    "cleanup": ["/include", "/lib/pkgconfig",
+                "/share/pkgconfig", "/share/aclocal",
+                "/man", "/share/man", "/share/gtk-doc",
+                "*.la", "*.a",
+                "/lib/girepository-1.0",
+                "/share/dbus-1", "/share/doc", "/share/gir-1.0"
+    ],
+    "modules": [
+        "libretro-cores/libretro-samples.json",
+        /* End libretro cores */
+        {
+            "name": "retro-gtk",
+            "config-opts": [
+                "--disable-static"
+            ],
+            "sources": [
+                {
+                    "type": "git",
+                    "url": "https://git.gnome.org/browse/retro-gtk";
+                }
+            ]
+        },
+        {
+            "name": "retro-gtk-demo-samples-test",
+            "post-install": [
+                "mkdir -p /app/bin/",
+                "install -m755 -p retro-gtk-demo-samples-test /app/bin/"
+            ],
+            "sources": [
+                {
+                    "type": "file",
+                    "path": "retro-gtk-demo-samples-test",
+                    "dest-filename": "retro-gtk-demo-samples-test"
+                },
+                {
+                    "type": "file",
+                    "path": "retro-gtk-demo-samples-test-Makefile",
+                    "dest-filename": "Makefile"
+                }
+            ]
+        }
+    ]
+}
diff --git a/flatpak/retro-gtk-demo-samples-test b/flatpak/retro-gtk-demo-samples-test
new file mode 100644
index 0000000..4ed1f77
--- /dev/null
+++ b/flatpak/retro-gtk-demo-samples-test
@@ -0,0 +1,2 @@
+#!/bin/sh
+retro-gtk-demo /app/lib/libretro/test_libretro.so
diff --git a/retro-gtk/retro-environment.c b/retro-gtk/retro-environment.c
index 40099f6..7ce66f5 100644
--- a/retro-gtk/retro-environment.c
+++ b/retro-gtk/retro-environment.c
@@ -78,7 +78,8 @@ static gboolean get_input_device_capabilities (RetroCore *self, guint64 *capabil
 
        input = retro_core_get_input_interface (self);
 
-       g_return_val_if_fail (input != NULL, FALSE);
+       if (input == NULL)
+               return FALSE;
 
        *capabilities = retro_input_get_device_capabilities (input);
 
@@ -152,7 +153,8 @@ static gboolean set_input_descriptors (RetroCore *self, RetroInputDescriptor *de
 
        input = retro_core_get_input_interface (self);
 
-       g_return_val_if_fail (input != NULL, FALSE);
+       if (input == NULL)
+               return FALSE;
 
        for (length = 0 ; descriptors[length].description ; length++);
        retro_input_set_descriptors (input, descriptors, length);
@@ -366,7 +368,7 @@ static void on_input_poll () {
        input = retro_core_get_input_interface (self);
 
        if (input == NULL)
-               g_return_if_reached ();
+               return 0;
 
        retro_input_poll (input);
 }
@@ -383,7 +385,7 @@ static gint16 on_input_state (guint port, guint device, guint index, guint id) {
        input = retro_core_get_input_interface (self);
 
        if (input == NULL)
-               g_return_val_if_reached (0);
+               return 0;
 
        return retro_input_get_state (input, port, device, index, id);
 }


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