Big mode, controller support (just SDL for now), other weird shit

This commit is contained in:
Nekobit 2023-09-10 00:38:44 -04:00
parent e164d9fc43
commit cee156903a
11 changed files with 307 additions and 51 deletions

2
.gitignore vendored
View File

@ -8,6 +8,8 @@ traversal_server
User
Sys
*.iso
*.ciso
*.json
scripts/build.log
scripts/Ishiiruka
scripts/work

View File

@ -1,7 +1,7 @@
CC=cc
CFLAGS=`pkg-config --cflags efl ecore elementary` `curl-config --cflags`
LDFLAGS=`pkg-config --libs efl ecore elementary` `curl-config --libs` -lcjson
OBJS=main.o replay.o home.o
CFLAGS=-g `pkg-config --cflags efl ecore elementary` `sdl2-config --cflags` `curl-config --cflags`
LDFLAGS=`pkg-config --libs efl ecore elementary` `sdl2-config --libs` `curl-config --libs` -lcjson
OBJS=main.o replay.o home.o input.o
minilauncher4slippi: $(OBJS)
$(CC) -o minilauncher4slippi $(OBJS) $(LDFLAGS)

5
home.c
View File

@ -2,7 +2,6 @@
#include <curl/curl.h>
#include <cjson/cJSON.h>
#include <stdint.h>
#include <md4c-html.h>
#include "replay.h"
Evas_Object* tab_home = NULL;
@ -144,8 +143,7 @@ _tab_home_make_da_damn_request()
}
void
Evas_Object*
tab_home_setup(Evas_Object* parent)
{
curl_global_init(CURL_GLOBAL_ALL);
@ -173,4 +171,5 @@ tab_home_setup(Evas_Object* parent)
evas_object_show(tab_home);
_tab_home_make_da_damn_request();
return tab_home;
}

2
home.h
View File

@ -8,7 +8,7 @@
extern Evas_Object* tab_home;
void
Evas_Object*
tab_home_setup(Evas_Object* parent);
#endif /* HOME_H */

110
input.c Normal file
View File

@ -0,0 +1,110 @@
#include <Ecore.h>
#include <Elementary.h>
#include "input.h"
static SDL_GameController* gamepad;
extern Evas_Object* win, *mainer, *_tab_curr;
void
_launch_slippi_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
void
input_sdl_init_thread()
{
Ecore_Thread* thread = ecore_thread_run(_input_sdl_setup_thread, NULL, NULL, NULL);
ecore_thread_local_data_set(thread, "win", win, NULL);
}
static void
input_sdl_eventloop(Ecore_Thread *thread)
{
SDL_Event e;
while (1)
{
while (SDL_PollEvent(&e))
{
ecore_thread_main_loop_begin();
switch (e.type) {
case SDL_CONTROLLERDEVICEADDED:
if (!gamepad) {
gamepad = SDL_GameControllerOpen(e.cdevice.which);
printf("Found\n");
}
break;
case SDL_CONTROLLERDEVICEREMOVED:
if (gamepad) {
SDL_GameControllerClose(gamepad);
gamepad = NULL;
printf("Removed.\n");
}
break;
case SDL_CONTROLLERBUTTONDOWN:
{
Evas_Object* focused = ecore_thread_local_data_find(thread, "win");
switch (e.cbutton.button)
{
case SDL_CONTROLLER_BUTTON_DPAD_UP:
elm_object_focus_next(focused, ELM_FOCUS_UP);
break;
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
elm_object_focus_next(focused, ELM_FOCUS_RIGHT);
break;
case SDL_CONTROLLER_BUTTON_DPAD_DOWN:
elm_object_focus_next(focused, ELM_FOCUS_DOWN);
break;
case SDL_CONTROLLER_BUTTON_DPAD_LEFT:
elm_object_focus_next(focused, ELM_FOCUS_LEFT);
break;
case SDL_CONTROLLER_BUTTON_A:
evas_object_smart_callback_call(elm_object_focused_object_get(focused), "clicked", NULL);
evas_object_smart_callback_call(elm_object_focused_object_get(focused), "activate", NULL);
break;
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER:
prev_tab();
break;
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER:
next_tab();
break;
case SDL_CONTROLLER_BUTTON_START:
_launch_slippi_cb(NULL, NULL, NULL);
break;
}
//evas_object_smart_callback_call(elm_object_focused_object_get(focused), "selected", elm_object_focused_object_get(focused));
elm_object_focus_set(elm_object_focused_object_get(focused), EINA_TRUE);
//elm_object_item_focus_set(elm_object_focused_object_get(focused), EINA_TRUE);
break;
}
default:
break;
}
ecore_thread_main_loop_end();
}
}
}
void
input_sdl_setup()
{
if (SDL_Init(SDL_INIT_GAMECONTROLLER) < 0)
{
fprintf(stderr, "Couldn't initialize SDL Gamepad: %s\n", SDL_GetError());
return;
}
for (int i = 0; i < SDL_NumJoysticks(); ++i)
{
if (SDL_IsGameController(i))
{
gamepad = SDL_GameControllerOpen(i);
printf("%i gamepads were found. Using %s (#%i).\n",
SDL_NumJoysticks(), SDL_GameControllerName(gamepad), i+1);
break;
}
}
}
void
_input_sdl_setup_thread(void *data, Ecore_Thread *thread)
{
input_sdl_setup();
input_sdl_eventloop(thread);
}

14
input.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef INPUT_H
#define INPUT_H
#include <SDL2/SDL.h>
void
input_sdl_setup();
void
input_sdl_init_thread();
void
_input_sdl_setup_thread();
#endif /* INPUT_H */

155
main.c
View File

@ -5,6 +5,9 @@
#include <Elementary.h>
#include "replay.h"
#include "home.h"
#ifndef NO_SDL_INPUT
# include "input.h"
#endif
int opt_mallocd = -1;
char* game_path = "SSBM.iso";
@ -14,10 +17,37 @@ char* dolphin_replay_file = "slippi-playback-dolphin";
Evas_Object* mainer;
Evas_Object* win;
Evas_Object* _tab_curr;
//extern Evas_Object* tab_home;
//extern Evas_Object* tab_replays;
extern Evas_Object* tab_home;
extern Evas_Object* tab_replays;
Evas_Object* _tabs[] = { NULL, NULL };
int _tabs_len = 2;
int _tabs_i = 0; // home
Evas_Object* tab_config;
void update_tab(Evas_Object*);
void
prev_tab()
{
--_tabs_i;
if (_tabs_i == -1)
{
_tabs_i = _tabs_len-1;
}
update_tab(_tabs[_tabs_i]);
}
void
next_tab()
{
++_tabs_i;
if (_tabs_i == _tabs_len)
{
_tabs_i = 0;
}
update_tab(_tabs[_tabs_i]);
}
int
parse_config(char* file)
{
@ -47,30 +77,33 @@ abort:
return 0;
}
void
update_tab(Evas_Object* newtab)
{
elm_obj_box_unpack_all(mainer);
evas_object_hide(_tab_curr);
if (newtab)
{
_tab_curr = newtab;
evas_object_size_hint_weight_set(_tab_curr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(mainer);
evas_object_show(_tab_curr);
elm_obj_box_pack_end(mainer, _tab_curr);
}
}
void
_tab_switch_cb(void *_data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object** data = _data;
elm_obj_box_unpack_all(mainer);
evas_object_hide(_tab_curr);
_tab_curr = *data;
evas_object_size_hint_weight_set(_tab_curr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
//elm_obj_box_recalculate(mainer);
evas_object_show(mainer);
evas_object_show(_tab_curr);
elm_obj_box_pack_end(mainer, _tab_curr);
//evas_object_move(_tab_curr, 100, 15);
//evas_object_resize(_tab_curr, 100, 100);
//Evas_Object* test = elm_button_add(mainer);
//elm_object_text_set(test, "Test button");
//evas_object_show(test);
//elm_obj_box_pack_end(mainer, test);
update_tab(*data);
}
void _prev_tab_cb(void *_data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{ prev_tab(); }
void _next_tab_cb(void *_data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{ next_tab(); }
void
_launch_slippi_job_end_cb(void *data, Ecore_Thread *thread)
{
@ -94,10 +127,11 @@ _launch_slippi_job_cb(void *data, Ecore_Thread *thread)
}
}
static void
void
_launch_slippi_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
elm_object_disabled_set(data, EINA_TRUE);
if (data)
elm_object_disabled_set(data, EINA_TRUE);
ecore_thread_run(_launch_slippi_job_cb,
_launch_slippi_job_end_cb,
_launch_slippi_job_end_cb, data);
@ -116,14 +150,14 @@ _replays_tab_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_
void
tabs_init()
{
tab_home_setup(mainer);
_tabs[0] = tab_home_setup(mainer);
// BEGIN tab_replays
tab_replays_setup(mainer);
// END tab_replays
_tabs[1] = tab_replays_setup(mainer);
// Show home tab at start
_tab_curr = tab_home;
evas_object_show(_tab_curr);
elm_obj_box_pack_end(mainer, _tab_curr);
@ -163,13 +197,25 @@ elm_main(int argc, char **argv)
elm_win_resize_object_add(win, main);
evas_object_show(main);
elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
elm_win_focus_highlight_animate_set(win, EINA_TRUE);
// Check for a 'b' character, aka big picture mode, big mode, whatever..
int bigmode = 0;
if (argc > 1 && argv[1] && tolower(argv[1][0]) == 'b')
{
bigmode = 1;
elm_object_scale_set(win, 1.8);
}
// END main
// BEGIN toolbar
tb_box = elm_box_add(win);
tb = elm_toolbar_add(tb_box);
elm_box_horizontal_set(tb_box, EINA_TRUE);
if (!bigmode)
{
tb = elm_toolbar_add(tb_box);
elm_object_style_set(tb, "item_horizontal");
elm_toolbar_homogeneous_set(tb, EINA_TRUE);
elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU);
@ -191,26 +237,61 @@ elm_main(int argc, char **argv)
elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
elm_toolbar_item_priority_set(tb_it, -9999);
elm_toolbar_menu_parent_set(tb, win);
}
// Play button
that = elm_button_add(tb_box);
elm_object_text_set(that, "Play");
evas_object_smart_callback_add(that, "clicked", _launch_slippi_cb, that);
Evas_Object* icon = elm_icon_add(win);
elm_icon_standard_set(icon, "input-gaming");
elm_icon_resizable_set(icon, EINA_TRUE, EINA_FALSE);
elm_object_part_content_set(that, "icon", icon);
evas_object_show(that);
elm_box_pack_end(tb_box, that);
elm_box_pack_end(tb_box, that);
// End play button
elm_box_pack_end(tb_box, tb);
that = elm_clock_add(tb_box);
if (bigmode)
{
// Prev button
that = elm_button_add(tb_box);
elm_object_text_set(that, "");
evas_object_smart_callback_add(that, "clicked", _prev_tab_cb, NULL);
/*ICON*/icon = elm_icon_add(win);
elm_icon_standard_set(icon, "go-previous");
elm_icon_resizable_set(icon, EINA_TRUE, EINA_FALSE);
elm_object_part_content_set(that, "icon", icon);
/*END ICON*/
evas_object_show(that);
elm_box_pack_end(tb_box, that);
elm_box_pack_start(tb_box, that);
elm_box_pack_end(main, tb_box);
// Next button
that = elm_button_add(tb_box);
elm_object_text_set(that, "");
evas_object_smart_callback_add(that, "clicked", _next_tab_cb, that);
/*ICON*/icon = elm_icon_add(win);
elm_icon_standard_set(icon, "go-next");
elm_icon_resizable_set(icon, EINA_TRUE, EINA_FALSE);
elm_object_part_content_set(that, "icon", icon);
/*END ICON*/
evas_object_show(that);
elm_box_pack_end(tb_box, that);
}
if (!bigmode)
{
elm_box_pack_end(tb_box, tb);
that = elm_clock_add(tb_box);
evas_object_size_hint_fill_set(that, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(that);
elm_box_pack_end(tb_box, that);
evas_object_show(tb);
}
elm_box_pack_end(main, tb_box);
evas_object_show(tb_box);
evas_object_show(tb);
// END toolbar
mainer = elm_box_add(win);
@ -225,10 +306,16 @@ elm_main(int argc, char **argv)
tabs_init();
evas_object_resize(win, 520 * elm_config_scale_get(),
300 * elm_config_scale_get());
300 * elm_config_scale_get());
evas_object_show(win);
printf("[Current config] %s, %s, %s\n", game_path, dolphin_emu_file, dolphin_replay_file);
// Setup input
#ifndef NO_SDL_INPUT
input_sdl_init_thread();
#endif
elm_run();
if (opt_mallocd >= 0) free(game_path);

View File

@ -1,3 +1,3 @@
SSBM.iso
SSBM.ciso
slippi-netplay-dolphin
slippi-playback-dolphin

View File

@ -220,7 +220,7 @@ _item_select_cb(void *data, Evas_Object *obj, void *event_info)
free(jason);
}
void
Evas_Object*
tab_replays_setup(Evas_Object* parent)
{
tab_replays = elm_genlist_add(parent);
@ -248,5 +248,5 @@ tab_replays_setup(Evas_Object* parent)
}
evas_object_size_hint_align_set(tab_replays, EVAS_HINT_FILL, EVAS_HINT_FILL);
return tab_replays;
}

View File

@ -8,7 +8,7 @@
extern Evas_Object* tab_replays;
void
Evas_Object*
tab_replays_setup(Evas_Object* parent);
#endif /* REPLAY_H */

View File

@ -15,6 +15,26 @@ then
SU="doas"
fi
if command -v pkg > /dev/null
then
echo "You're on FreeBSD! This works fine, but be mindful of any errors!"
fi
nf() { if ! command -v "$1" > /dev/null; then echo "$1 not found. Set \$IJUSTKNOWOKAY to skip these checks."; exit 2; fi }
npkgcnf() { if ! pkg-config --libs "$1" > /dev/null; then echo "library $1 not found. Set \$IJUSTKNOWOKAY to skip these checks."; exit 3; fi }
# Just some bin tests
if [ ! "$IJUSTKNOWOKAY" ]
then
nf "rustc"
nf "git"
nf "pkg-config"
nf "cmake"
npkgcnf "libcurl"
npkgcnf "libusb-1.0"
npkgcnf "libpng"
fi
if [ "$_IS_INSTALL" = "install" ]
then
CMAKE_FLAGS="$CMAKE_FLAGS -DINSTALLMODE=true"
@ -37,14 +57,34 @@ if [ "$_PATH" == "git" ]
then
echo "== Cloning Slippi Ishiiruka..."
# Point to my own fork for now until I provide .patch files
git clone --recurse-submodules -j$THREADS "https://github.com/nekobbbbbbit/Ishiiruka.git" work > /dev/null || exit
cd work
else
cd "$_PATH"
if [ ! -d "work" ]
then
git clone --recurse-submodules -j$THREADS "https://github.com/nekobbbbbbit/Ishiiruka.git" work > /dev/null || exit
else
printf "Already git cloned. Checking updates.\n[GIT] "
git -C work pull
echo "git pull returned $?"
echo "You should probably check Minilauncher for updates too =^)"
fi
_PATH=work
fi
cd "$_PATH"
echo "NOTE: Build logs are stored in build.log"
check_error()
{
if [ $? -eq 0 ]
then
echo ">>> :-)"
else
echo -e "--------- Command failed. build.log output ---------\n[ *snip* ]"
tail -n 45 "$PWD_/build.log"
echo ">>> :-("
exit 1
fi
}
build_slippi()
{
BUILD_DIR="$1"
@ -57,10 +97,14 @@ build_slippi()
DATE=$(date "+%Y-%m-%d %H:%M:%S")
echo ">>>>>> BEGIN BUILD LOG ON $DATE" >> "$PWD_/build.log"
echo ">>> cmake $CMAKE_F .." >> "$PWD_/build.log"
cmake $CMAKE_F .. >> "$PWD_/build.log" 2>&1 || exit 1
echo ">>> cmake $CMAKE_F .."
cmake $CMAKE_F .. >> "$PWD_/build.log" 2>&1
check_error
echo "== Building $NEW_BIN_NAME"
echo ">>> make -j$THREADS" >> "$PWD_/build.log"
make -j$THREADS >> "$PWD_/build.log" 2>&1 || exit 1
echo ">>> make -j$THREADS"
make -j$THREADS >> "$PWD_/build.log" 2>&1
check_error
echo ">>>>>> END BUILD LOG ON $DATE" >> "$PWD_/build.log"
cd ..
# Copy the Sys folder in