diff --git a/Makefile.common b/Makefile.common index 6d3aa84f8f..894960f6f2 100644 --- a/Makefile.common +++ b/Makefile.common @@ -2437,6 +2437,10 @@ ifeq ($(HAVE_VITAGLES), 1) OBJ += $(patsubst %.c,%.o,$(foreach dir,$(SOURCES), $(wildcard $(dir)/*.c))) endif +ifeq ($(HAVE_WEBOS), 1) + DEFINES += -DWEBOS +endif + ##################################### ### Android Play Feature Delivery ### ### (Play Store build core ### diff --git a/Makefile.webos b/Makefile.webos new file mode 100644 index 0000000000..1e5c4091fc --- /dev/null +++ b/Makefile.webos @@ -0,0 +1,242 @@ +include version.all + +$(call assert,$(call seq,$(TARGET_PREFIX),arm-webos-linux-gnueabi-),webOS SDK isn't setup properly. See https://github.com/webosbrew/meta-lg-webos-ndk#compile-program-by-command-line) + +WEBOS_FREETYPE_CONFIG ?= $(SDKTARGETSYSROOT)/usr/bin/freetype-config + +WEBOS_INC_DIR ?= $(SDKTARGETSYSROOT)/usr/include +WEBOS_LIB_DIR ?= $(SDKTARGETSYSROOT)/usr/lib + +######################### +######################### + +PACKAGE_NAME = com.retroarch +PACKAGE_VERSION := $(patsubst "%",%,$(RARCH_VERSION)) + +DEBUG ?= 0 + +HAVE_SCREENSHOTS = 0 +HAVE_REWIND = 1 +HAVE_7ZIP = 1 +HAVE_ACCESSIBILITY = 1 +HAVE_AL = 0 +# ALSA freezes when switching back from menu +HAVE_ALSA = 0 +HAVE_ANGLE = 0 +HAVE_AUDIOIO = 0 +HAVE_AUDIOMIXER = 1 +HAVE_BLISSBOX = 0 +HAVE_BSV_MOVIE = 1 +HAVE_BUILTINBEARSSL = 0 +HAVE_BUILTINFLAC = 1 +HAVE_DSP_FILTER = 1 +HAVE_VIDEO_FILTER = 1 +HAVE_STATIC_VIDEO_FILTERS = 1 +HAVE_STATIC_AUDIO_FILTERS = 1 +HAVE_FILTERS_BUILTIN = 1 +HAVE_BUILTINMBEDTLS = 1 +HAVE_BUILTINZLIB = 1 +HAVE_C99 = 1 +HAVE_CC = 1 +HAVE_CC_RESAMPLER = 1 +HAVE_NEAREST_RESAMPLER = 1 +HAVE_CHD = 1 +HAVE_COMMAND = 1 +HAVE_CXX = 1 +HAVE_DR_MP3 = 1 +HAVE_DYNAMIC = 1 +HAVE_DYLIB = 1 +HAVE_EGL = 0 +HAVE_FREETYPE = 0 +HAVE_GDI = 1 +HAVE_GETADDRINFO = 1 +HAVE_GETOPT_LONG = 1 +HAVE_GLSL = 1 +HAVE_GLSLANG = 0 +HAVE_GLSLANG_HLSL = 0 +HAVE_GLSLANG_OGLCOMPILER = 0 +HAVE_GLSLANG_OSDEPENDENT = 0 +HAVE_GLSLANG_SPIRV = 0 +HAVE_GLSLANG_SPIRV_TOOLS = 0 +HAVE_GLSLANG_SPIRV_TOOLS_OPT = 0 +HAVE_HID = 1 +HAVE_IBXM = 1 +HAVE_IMAGEVIEWER = 1 +HAVE_LANGEXTRA = 1 +HAVE_LIBRETRODB = 1 +HAVE_MENU = 1 +HAVE_MENU_COMMON = 1 +HAVE_NEON = 1 +HAVE_NETPLAYDISCOVERY = 1 +HAVE_NETPLAYDISCOVERY = 1 +HAVE_NETWORK_CMD = 1 +HAVE_NETWORKGAMEPAD = 1 +HAVE_NETWORKING = 1 +HAVE_GFX_WIDGETS = 1 +HAVE_MMAP = 1 +HAVE_ONLINE_UPDATER = 1 +HAVE_OPENDINGUX_FBDEV = 0 +HAVE_OPENGL = 0 +HAVE_OPENGL1 = 0 +HAVE_OPENGL_CORE = 0 +HAVE_OPENGLES = 1 +HAVE_OPENGLES3 = 0 +HAVE_OPENGLES3_1 = 0 +HAVE_OPENGLES3_2 = 0 +HAVE_OPENSSL = 0 +HAVE_OVERLAY = 1 +HAVE_PULSE = 1 +HAVE_RBMP = 1 +HAVE_RJPEG = 1 +HAVE_RPILED = 0 +HAVE_RPNG = 1 +HAVE_RUNAHEAD = 1 +HAVE_SDL = 0 +HAVE_SDL2 = 1 +HAVE_SHADERPIPELINE = 1 +HAVE_STB_FONT = 1 +HAVE_STB_IMAGE = 1 +HAVE_STB_VORBIS = 1 +HAVE_STDIN_CMD = 0 +HAVE_STRCASESTR = 1 +HAVE_THREADS = 1 +HAVE_UDEV = 0 +HAVE_RGUI = 1 +HAVE_MATERIALUI = 0 +HAVE_XMB = 1 +HAVE_OZONE = 1 +HAVE_ZLIB = 1 +HAVE_CONFIGFILE = 1 +HAVE_PATCH = 1 +HAVE_CHEATS = 1 +HAVE_CHEEVOS = 1 +HAVE_LIBSHAKE = 1 +HAVE_UPDATE_ASSETS = 1 +HAVE_UPDATE_CORES = 1 + +OS = Linux +TARGET = retroarch + +OBJ := +LINK := $(CXX) +DEF_FLAGS += -ffunction-sections -fdata-sections +DEF_FLAGS += -I. -Ideps -Ideps/stb -DWEBOS=1 -MMD +DEF_FLAGS += -Wall -Wno-unused-variable +LIBS := -ldl -lz -lrt -pthread +CFLAGS := +CXXFLAGS := -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS +ASFLAGS := +LDFLAGS := -Wl,--gc-sections +INCLUDE_DIRS = -I$(WEBOS_INC_DIR) +LIBRARY_DIRS = -L$(WEBOS_LIB_DIR) +DEFINES := -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64 -UHAVE_STATIC_DUMMY +DEFINES += -DHAVE_C99=1 -DHAVE_CXX=1 -D_GNU_SOURCE +DEFINES += -DHAVE_GETOPT_LONG=1 -DHAVE_STRCASESTR=1 -DHAVE_DYNAMIC=1 +DEFINES += -DHAVE_FILTERS_BUILTIN +DEFINES += -DHAVE_SDL2 +DEFINES += -DHAVE_PULSE +DEFINES += -DHAVE_NETWORKING -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES + +SDL2_CFLAGS := $(shell pkg-config --cflags sdl2) +SDL2_LIBS := $(shell pkg-config --libs sdl2) +OPENGLES_LIBS = -lGLESv2 +PULSE_LIBS = $(shell pkg-config --libs libpulse) +MMAP_LIBS = -lc +NEON_CFLAGS = -mfpu=neon +NEON_ASFLAGS = -mfpu=neon +NETWORKING_LIBS = -lc + +OBJDIR_BASE := obj-unix + +ifeq ($(DEBUG), 1) + OBJDIR := $(OBJDIR_BASE)/debug + DEF_FLAGS += -O0 -g -DDEBUG -D_DEBUG +else + OBJDIR := $(OBJDIR_BASE)/release + DEF_FLAGS += -O2 -DNDEBUG +endif + +include Makefile.common + +DEF_FLAGS += $(INCLUDE_DIRS) +LDFLAGS += $(CFLAGS) $(CXXFLAGS) $(DEF_FLAGS) +CFLAGS += $(DEF_FLAGS) +CXXFLAGS += $(DEF_FLAGS) + +HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h) + +Q := @ + +RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) + +define APPINFO +{ + "id": "$(PACKAGE_NAME)", + "version": "$(PACKAGE_VERSION)", + "vendor": "webosbrew.org", + "title": "RetroArch", + "icon": "icon160.png", + "main": "retroarch", + "iconColor": "#333333", + "type": "native", + "appDescription": "Emulation frontend" +} +endef +export APPINFO + +all: $(TARGET) ipk + +-include $(RARCH_OBJ:.o=.d) + +SYMBOL_MAP := -Wl,-Map=output.map + +$(TARGET): $(RARCH_OBJ) + @$(if $(Q), $(shell echo echo LD $@),) + $(Q)$(LINK) -o $@ $(RARCH_OBJ) $(LIBS) $(LDFLAGS) $(LIBRARY_DIRS) + +$(OBJDIR)/%.o: %.c + @mkdir -p $(dir $@) + @$(if $(Q), $(shell echo echo CC $<),) + $(Q)$(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) -c -o $@ $< + +$(OBJDIR)/%.o: %.cpp + @mkdir -p $(dir $@) + @$(if $(Q), $(shell echo echo CXX $<),) + $(Q)$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $< + +$(OBJDIR)/%.o: %.m + @mkdir -p $(dir $@) + @$(if $(Q), $(shell echo echo OBJC $<),) + $(Q)$(CXX) $(OBJCFLAGS) $(DEFINES) -MMD -c -o $@ $< + +$(OBJDIR)/%.o: %.S $(HEADERS) + @mkdir -p $(dir $@) + @$(if $(Q), $(shell echo echo AS $<),) + $(Q)$(CC) $(CFLAGS) $(ASFLAGS) $(DEFINES) -c -o $@ $< + +clean: + rm -rf $(OBJDIR_BASE) + rm -f $(TARGET) + rm -f *.d + rm -rf webos/*.ipk + rm -rf webos/dist + +ipk: $(TARGET) + rm -rf webos/dist + mkdir -p webos/dist/lib + echo "$$APPINFO" > webos/dist/appinfo.json + cp -t webos/dist -vf $(TARGET) webos/icon160.png + cp -t webos/dist/lib -vf $(WEBOS_LIB_DIR)/libstdc++.so.6 + $(STRIP) webos/dist/$(TARGET) + cd webos && ares-package dist + +install: ipk + ares-install webos/$(PACKAGE_NAME)_$(PACKAGE_VERSION)_$(ARCH).ipk + +launch: install + ares-launch com.retroarch + +.PHONY: all clean ipk + +print-%: + @echo '$*=$($*)' diff --git a/config.def.h b/config.def.h index f6fecbece3..5eca3a88a8 100644 --- a/config.def.h +++ b/config.def.h @@ -224,8 +224,13 @@ /* Window */ /* Window size. A value of 0 uses window scale * multiplied by the core framebuffer size. */ +#if defined(WEBOS) +#define DEFAULT_WINDOW_WIDTH 1920 +#define DEFAULT_WINDOW_HEIGHT 1080 +#else #define DEFAULT_WINDOW_WIDTH 1280 #define DEFAULT_WINDOW_HEIGHT 720 +#endif /* Fullscreen resolution. A value of 0 uses the desktop * resolution. */ @@ -251,8 +256,18 @@ */ #define DEFAULT_WINDOW_OPACITY 100 -/* Whether to show the usual window decorations like border, titlebar etc. */ +/* DEFAULT_WINDOW_DECORATIONS: + Whether to show the usual window decorations like border, titlebar etc. */ +/* DEFAULT_WINDOW_SAVE_POSITIONS: + Whether to remember window positions + */ +#ifdef WEBOS +#define DEFAULT_WINDOW_DECORATIONS false +#define DEFAULT_WINDOW_SAVE_POSITIONS true +#else #define DEFAULT_WINDOW_DECORATIONS true +#define DEFAULT_WINDOW_SAVE_POSITIONS false +#endif #if defined(RARCH_CONSOLE) || defined(__APPLE__) #define DEFAULT_LOAD_DUMMY_ON_CORE_SHUTDOWN false @@ -1061,7 +1076,7 @@ static const bool audio_enable_menu_bgm = false; #define DEFAULT_REWIND_GRANULARITY 1 #endif /* Pause gameplay when gameplay loses focus. */ -#ifdef EMSCRIPTEN +#if defined(EMSCRIPTEN) || defined(WEBOS) #define DEFAULT_PAUSE_NONACTIVE false #else #define DEFAULT_PAUSE_NONACTIVE true diff --git a/configuration.c b/configuration.c index 89ddae6af4..805abc443c 100644 --- a/configuration.c +++ b/configuration.c @@ -427,6 +427,8 @@ static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XINPUT; static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_ANDROID; #elif defined(EMSCRIPTEN) && defined(HAVE_SDL2) static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_SDL2; +#elif defined(WEBOS) && defined(HAVE_SDL2) +static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_SDL2; #elif defined(EMSCRIPTEN) static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_RWEBINPUT; #elif defined(_WIN32) && defined(HAVE_DINPUT) @@ -479,6 +481,8 @@ static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_XINPUT; static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_GX; #elif defined(WIIU) static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_WIIU; +#elif defined(WEBOS) +static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_SDL; #elif defined(_XBOX) static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_XDK; #elif defined(PS2) @@ -1840,7 +1844,7 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("video_msg_bgcolor_enable", &settings->bools.video_msg_bgcolor_enable, true, message_bgcolor_enable, false); SETTING_BOOL("video_window_show_decorations", &settings->bools.video_window_show_decorations, true, DEFAULT_WINDOW_DECORATIONS, false); - SETTING_BOOL("video_window_save_positions", &settings->bools.video_window_save_positions, true, false, false); + SETTING_BOOL("video_window_save_positions", &settings->bools.video_window_save_positions, true, DEFAULT_WINDOW_SAVE_POSITIONS, false); SETTING_BOOL("sustained_performance_mode", &settings->bools.sustained_performance_mode, true, sustained_performance_mode, false); diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index 44946f9c93..70ec2d362c 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -2123,34 +2123,41 @@ static int frontend_unix_parse_drive_list(void *data, bool load_content) FILE_TYPE_DIRECTORY, 0, 0); } else - { menu_entries_append_enum(list, "/storage/emulated/0", msg_hash_to_str(MSG_REMOVABLE_STORAGE), enum_idx, FILE_TYPE_DIRECTORY, 0, 0); - } + menu_entries_append_enum(list, "/storage", msg_hash_to_str(MSG_REMOVABLE_STORAGE), enum_idx, FILE_TYPE_DIRECTORY, 0, 0); if (!string_is_empty(internal_storage_app_path)) - { menu_entries_append_enum(list, internal_storage_app_path, msg_hash_to_str(MSG_EXTERNAL_APPLICATION_DIR), enum_idx, FILE_TYPE_DIRECTORY, 0, 0); - } if (!string_is_empty(app_dir)) - { menu_entries_append_enum(list, app_dir, msg_hash_to_str(MSG_APPLICATION_DIR), enum_idx, FILE_TYPE_DIRECTORY, 0, 0); - } +#elif defined(WEBOS) + if (path_is_directory("/media/internal")) + menu_entries_append_enum(list, "/media/internal", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + + if (path_is_directory("/tmp/usb")) + menu_entries_append_enum(list, "/tmp/usb", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); #else char base_path[PATH_MAX] = {0}; char udisks_media_path[PATH_MAX] = {0}; diff --git a/gfx/drivers_context/sdl_gl_ctx.c b/gfx/drivers_context/sdl_gl_ctx.c index b8eb56e6f6..68cf7b4320 100644 --- a/gfx/drivers_context/sdl_gl_ctx.c +++ b/gfx/drivers_context/sdl_gl_ctx.c @@ -32,6 +32,10 @@ #include "../common/sdl2_common.h" #endif +#if defined(WEBOS) && defined(HAVE_SDL2) +#include +#endif + typedef struct gfx_ctx_sdl_data { int width; @@ -41,6 +45,7 @@ typedef struct gfx_ctx_sdl_data bool full; bool resized; + bool subsystem_inited; #ifdef HAVE_SDL2 SDL_Window *win; @@ -73,6 +78,19 @@ static void sdl_ctx_destroy_resources(gfx_ctx_sdl_data_t *sdl) sdl->win = NULL; } +static void sdl_ctx_destroy(void *data) +{ + gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*)data; + + if (!sdl) + return; + + sdl_ctx_destroy_resources(sdl); + if (sdl->subsystem_inited) + SDL_QuitSubSystem(SDL_INIT_VIDEO); + free(sdl); +} + static void *sdl_ctx_init(void *video_driver) { gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*) @@ -86,6 +104,12 @@ static void *sdl_ctx_init(void *video_driver) XInitThreads(); #endif +#ifdef WEBOS + SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_KEYS_BACK, "true"); + SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_KEYS_EXIT, "true"); + SDL_SetHint(SDL_HINT_WEBOS_CURSOR_SLEEP_TIME, "1000"); +#endif + /* Initialise graphics subsystem, if required */ if (sdl_subsystem_flags == 0) { @@ -96,6 +120,7 @@ static void *sdl_ctx_init(void *video_driver) { if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) goto error; + sdl->subsystem_inited = true; } RARCH_LOG("[SDL_GL] SDL %i.%i.%i gfx context driver initialized.\n", @@ -107,24 +132,11 @@ error: RARCH_WARN("[SDL_GL]: Failed to initialize SDL gfx context driver: %s\n", SDL_GetError()); - sdl_ctx_destroy_resources(sdl); - - if (sdl) - free(sdl); + sdl_ctx_destroy(sdl); return NULL; } -static void sdl_ctx_destroy(void *data) -{ - gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*)data; - - if (!sdl) - return; - - sdl_ctx_destroy_resources(sdl); - free(sdl); -} static enum gfx_ctx_api sdl_ctx_get_api(void *data) { return sdl_api; } @@ -201,7 +213,8 @@ static bool sdl_ctx_set_video_mode(void *data, { unsigned display = video_monitor_index; - sdl->win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED_DISPLAY(display), + sdl->win = SDL_CreateWindow("RetroArch", + SDL_WINDOWPOS_UNDEFINED_DISPLAY(display), SDL_WINDOWPOS_UNDEFINED_DISPLAY(display), width, height, SDL_WINDOW_OPENGL | fsflag); } diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index e6a64be02c..d0961411ac 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -35,6 +35,11 @@ #include "../../gfx/common/sdl2_common.h" #endif +#ifdef WEBOS +#include +#include +#endif + /* TODO/FIXME - * fix game focus toggle */ @@ -55,6 +60,15 @@ typedef struct sdl_input int mouse_wr; } sdl_input_t; +#ifdef WEBOS +enum sdl_webos_special_key { + sdl_webos_spkey_back, + sdl_webos_spkey_size, +}; + +static uint8_t sdl_webos_special_keymap[sdl_webos_spkey_size] = {0}; +#endif + static void *sdl_input_init(const char *joypad_driver) { sdl_input_t *sdl = (sdl_input_t*)calloc(1, sizeof(*sdl)); @@ -77,6 +91,18 @@ static bool sdl_key_pressed(int key) unsigned sym = rarch_keysym_lut[(enum retro_key)key]; #endif +#ifdef WEBOS + if ( (key == RETROK_BACKSPACE ) + && sdl_webos_special_keymap[sdl_webos_spkey_back]) + { + /* Reset to unpressed state */ + sdl_webos_special_keymap[sdl_webos_spkey_back] = 0; + return true; + } + if (key == RETROK_F1 && keymap[SDL_WEBOS_SCANCODE_EXIT]) + return true; +#endif + if (sym >= (unsigned)num_keys) return false; @@ -164,6 +190,27 @@ static int16_t sdl_input_state( return sdl->mouse_l; case RETRO_DEVICE_ID_MOUSE_RIGHT: return sdl->mouse_r; +#ifdef WEBOS + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + /* Note: webOS wheel is reversed */ + if (sdl->mouse_wd != 0) + { + sdl->mouse_wd = 0; + return 1; + } + return 0; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + if (sdl->mouse_wu != 0) + { + sdl->mouse_wu = 0; + return 1; + } + return 0; + case RETRO_DEVICE_ID_MOUSE_X: + return sdl->mouse_abs_x; + case RETRO_DEVICE_ID_MOUSE_Y: + return sdl->mouse_abs_y; +#else case RETRO_DEVICE_ID_MOUSE_WHEELUP: return sdl->mouse_wu; case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: @@ -172,6 +219,7 @@ static int16_t sdl_input_state( return sdl->mouse_x; case RETRO_DEVICE_ID_MOUSE_Y: return sdl->mouse_y; +#endif case RETRO_DEVICE_ID_MOUSE_MIDDLE: return sdl->mouse_m; case RETRO_DEVICE_ID_MOUSE_BUTTON_4: @@ -330,9 +378,41 @@ static void sdl_input_poll(void *data) { if (event.type == SDL_KEYDOWN || event.type == SDL_KEYUP) { - uint16_t mod = 0; + uint16_t mod = 0; unsigned code = input_keymaps_translate_keysym_to_rk( event.key.keysym.sym); +#ifdef WEBOS + switch ((int) event.key.keysym.scancode) + { + case SDL_WEBOS_SCANCODE_BACK: + /* Because webOS is sending DOWN/UP at the same time, + we save this flag for later */ + sdl_webos_special_keymap[sdl_webos_spkey_back] |= event.type == SDL_KEYDOWN; + code = RETROK_BACKSPACE; + break; + case SDL_WEBOS_SCANCODE_RED: + code = RETROK_x; + break; + case SDL_WEBOS_SCANCODE_GREEN: + code = RETROK_z; + break; + case SDL_WEBOS_SCANCODE_YELLOW: + code = RETROK_s; + break; + case SDL_WEBOS_SCANCODE_BLUE: + code = RETROK_a; + break; + case SDL_WEBOS_SCANCODE_EXIT: + code = RETROK_F1; + break; + default: + break; + } + + /* Disable cursor when using the buttons */ + if (code && code != RETROK_RETURN) + SDL_webOSCursorVisibility(0); +#endif if (event.key.keysym.mod & KMOD_SHIFT) mod |= RETROKMOD_SHIFT; @@ -396,3 +476,23 @@ input_driver_t input_sdl = { #endif NULL }; + +#ifdef WEBOS +SDL_bool SDL_webOSCursorVisibility(SDL_bool visible) +{ + static SDL_bool (*fn)(SDL_bool visible) = NULL; + static bool dlsym_called = false; + if (!dlsym_called) + { + fn = dlsym(RTLD_NEXT, "SDL_webOSCursorVisibility"); + dlsym_called = true; + } + if (!fn) + { + SDL_ShowCursor(SDL_DISABLE); + SDL_ShowCursor(SDL_ENABLE); + return SDL_TRUE; + } + return fn(visible); +} +#endif diff --git a/input/drivers_joypad/sdl_joypad.c b/input/drivers_joypad/sdl_joypad.c index 4d272a32e4..2d48aa3e20 100644 --- a/input/drivers_joypad/sdl_joypad.c +++ b/input/drivers_joypad/sdl_joypad.c @@ -138,6 +138,17 @@ static void sdl_pad_connect(unsigned id) vendor = guid_ptr[0]; product = guid_ptr[1]; #endif +#ifdef WEBOS + if (vendor == 0x9999 && product == 0x9999) + { + RARCH_WARN("[SDL_JOYPAD]: Ignoring pad #%d (vendor: %d; product: %d)\n", id, vendor, product); + if (pad->joypad) + SDL_JoystickClose(pad->joypad); + + pad->joypad = NULL; + return; + } +#endif #endif input_autoconfigure_connect( diff --git a/retroarch.c b/retroarch.c index db80f15d8c..0e9b86dbbf 100644 --- a/retroarch.c +++ b/retroarch.c @@ -34467,9 +34467,12 @@ static bool retroarch_parse_input_and_config( optstring = "hs:fvS:A:U:DN:d:" BSV_MOVIE_ARG NETPLAY_ARG DYNAMIC_ARG FFMPEG_RECORD_ARG CONFIG_FILE_ARG; -#ifdef ORBIS +#if defined(ORBIS) argv = &(argv[2]); argc = argc - 2; +#elif defined(WEBOS) + argv = &(argv[1]); + argc = argc - 1; #endif #ifndef HAVE_MENU diff --git a/webos/.gitignore b/webos/.gitignore new file mode 100644 index 0000000000..9b51aa2c69 --- /dev/null +++ b/webos/.gitignore @@ -0,0 +1,3 @@ +dist/ +prefix/ +*.ipk diff --git a/webos/README.md b/webos/README.md new file mode 100644 index 0000000000..47a9dc7762 --- /dev/null +++ b/webos/README.md @@ -0,0 +1,14 @@ +## Building +```sh +make -f Makefile.webos clean +make -f Makefile.webos -j$(ncpu --all) ipk +``` + +## Testing +```sh +# Install and launch via ares-launch +make -f Makefile.webos launch + +# Start installed application via SSH +XDG_RUNTIME_DIR=/tmp/xdg /usr/bin/jailer -t native_devmode -i com.retroarch -p /media/developer/apps/usr/palm/applications/com.retroarch /media/developer/apps/usr/palm/applications/com.retroarch/retroarch --verbose --verbose +``` diff --git a/webos/appinfo.json b/webos/appinfo.json new file mode 100644 index 0000000000..79ab0fae82 --- /dev/null +++ b/webos/appinfo.json @@ -0,0 +1,11 @@ +{ + "id": "com.retroarch", + "version": "1.9.8", + "vendor": "libretro.com", + "title": "RetroArch", + "icon": "icon160.png", + "main": "retroarch", + "iconColor": "#333333", + "type": "native", + "appDescription": "Official Libretro frontend" +} diff --git a/webos/build-icon.sh b/webos/build-icon.sh new file mode 100644 index 0000000000..0ae88daca9 --- /dev/null +++ b/webos/build-icon.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +convert -background none media/retroarch.svg -resize 160x160 -negate webos/icon160.png diff --git a/webos/icon160.png b/webos/icon160.png new file mode 100644 index 0000000000..e03560b1d4 Binary files /dev/null and b/webos/icon160.png differ