Scrolling with C-stick

This commit is contained in:
Nekobit 2023-09-10 16:56:27 -04:00
parent c141b9c43f
commit 5136ee13e5
3 changed files with 49 additions and 72 deletions

113
input.c
View File

@ -5,68 +5,32 @@
Ecore_Event_Key* ev = NULL; Ecore_Event_Key* ev = NULL;
int event_ready = 0; int event_ready = 0;
static SDL_GameController* gamepad; static SDL_GameController* gamepad;
extern Evas_Object* win, *mainer, *_tab_curr; extern Evas_Object* win, *mainer, *_tab_curr, *tab_scroller;
void void _launch_slippi_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
_launch_slippi_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); float y_mod = 0.0f;
void void
bye(void*x, void* y) free_ev(void* that, void* who_even_cares EINA_UNUSED)
{ {
printf("Im die\n"); free(that);
} }
Eina_Bool Eina_Bool
_timer_cb(void *data) _scroll_loop_cb(void* data)
{ {
if (event_ready) int x, y, w, h;
{ elm_scroller_region_get(tab_scroller, &x, &y, &w, &h);
ev = calloc(1, sizeof(Ecore_Event_Key)*24); y += y_mod;
ev->timestamp = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff); elm_scroller_region_show(tab_scroller, x, y, w, h);
ev->window = elm_win_window_id_get(win);
ev->event_window = elm_win_window_id_get(win);
ev->modifiers = 0;
ev->key = "Up";
ev->compose = NULL;
ev->keyname = "Up";
ev->string = NULL;
ev->data = NULL;
ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, bye, NULL);
//evas_event_feed_key_down(win, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
//ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
printf("Event sent\n");
event_ready = 0;
}
return EINA_TRUE; return EINA_TRUE;
} }
static Eina_Bool
help(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *_ev)
{
Ecore_Event_Key* ev = _ev;
printf("ev->window: %d\n"
"ev->event_window: %d\n"
"ev->modifiers: %d\n"
"ev->key: %s\n"
"ev->compose: %s\n"
"ev->keyname: %s\n"
"ev->string: %s\n"
"ev->data: %p\n",
ev->window, ev->event_window, ev->modifiers,
ev->key, ev->compose, ev->keyname, ev->string, ev->data);
//ecore_main_loop_quit();
return ECORE_CALLBACK_DONE;
}
void void
input_sdl_init_thread() input_sdl_init_thread()
{ {
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, help, NULL); ecore_timer_add(.005, _scroll_loop_cb, NULL);
ecore_timer_add(.01, _timer_cb, NULL);
//ev = calloc(1, sizeof(Ecore_Event_Key)*30);
Ecore_Thread* thread = ecore_thread_run(_input_sdl_setup_thread, NULL, NULL, NULL); Ecore_Thread* thread = ecore_thread_run(_input_sdl_setup_thread, NULL, NULL, NULL);
ecore_thread_local_data_set(thread, "win", win, NULL);
} }
static void static void
@ -82,50 +46,55 @@ input_sdl_eventloop(Ecore_Thread *thread)
case SDL_CONTROLLERDEVICEADDED: case SDL_CONTROLLERDEVICEADDED:
if (!gamepad) { if (!gamepad) {
gamepad = SDL_GameControllerOpen(e.cdevice.which); gamepad = SDL_GameControllerOpen(e.cdevice.which);
printf("Found\n"); printf("Found controller.\n");
} }
break; break;
case SDL_CONTROLLERDEVICEREMOVED: case SDL_CONTROLLERDEVICEREMOVED:
if (gamepad) { if (gamepad) {
SDL_GameControllerClose(gamepad); SDL_GameControllerClose(gamepad);
gamepad = NULL; gamepad = NULL;
printf("Removed.\n"); printf("Removed controller.\n");
} }
break; break;
case SDL_CONTROLLERAXISMOTION:
{
int deadzone = 3000;
float r_y = SDL_GameControllerGetAxis(gamepad, SDL_CONTROLLER_AXIS_RIGHTY);
if (abs(r_y) > deadzone)
{
y_mod = r_y / 4000;
}
else y_mod = 0;
}
break;
case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONDOWN:
{ {
Evas_Object* focused = ecore_thread_local_data_find(thread, "win"); Evas_Object* focused = win;
// Setup Event // Setup Event
ev = calloc(1, sizeof(Ecore_Event_Key));
ev->timestamp = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);
event_ready = 1; ev->window = elm_win_window_id_get(win);
ev->event_window = elm_win_window_id_get(win);
ecore_thread_main_loop_end();
printf("Run it back.\n");
continue;
// Handle // Handle
switch (e.cbutton.button) switch (e.cbutton.button)
{ {
case SDL_CONTROLLER_BUTTON_DPAD_UP: case SDL_CONTROLLER_BUTTON_DPAD_UP:
//elm_object_focus_next(focused, ELM_FOCUS_UP); ev->key = "Up";
//ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
printf("Up pressed!\n");
//ecore_event_add(ECORE_EVENT_KEY_UP, );
break; break;
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: case SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
elm_object_focus_next(focused, ELM_FOCUS_RIGHT); ev->key = "Right";
break; break;
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: case SDL_CONTROLLER_BUTTON_DPAD_DOWN:
elm_object_focus_next(focused, ELM_FOCUS_DOWN); ev->key = "Down";
break; break;
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: case SDL_CONTROLLER_BUTTON_DPAD_LEFT:
elm_object_focus_next(focused, ELM_FOCUS_LEFT); ev->key = "Left";
break; break;
case SDL_CONTROLLER_BUTTON_A: case SDL_CONTROLLER_BUTTON_A:
evas_object_smart_callback_call(elm_object_focused_object_get(focused), "clicked", NULL); ev->key = "Return";
evas_object_smart_callback_call(elm_object_focused_object_get(focused), "activate", NULL);
break; break;
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: case SDL_CONTROLLER_BUTTON_LEFTSHOULDER:
prev_tab(); prev_tab();
@ -134,12 +103,16 @@ input_sdl_eventloop(Ecore_Thread *thread)
next_tab(); next_tab();
break; break;
case SDL_CONTROLLER_BUTTON_START: case SDL_CONTROLLER_BUTTON_START:
// Just what it says on the box
_launch_slippi_cb(NULL, NULL, NULL); _launch_slippi_cb(NULL, NULL, NULL);
break; break;
default:
free(ev);
ecore_thread_main_loop_end();
continue;
} }
//evas_object_smart_callback_call(elm_object_focused_object_get(focused), "selected", elm_object_focused_object_get(focused)); ev->keyname = ev->key;
elm_object_focus_set(elm_object_focused_object_get(focused), EINA_TRUE); ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, free_ev, ev);
//elm_object_item_focus_set(elm_object_focused_object_get(focused), EINA_TRUE);
break; break;
} }
default: default:

6
main.c
View File

@ -19,7 +19,9 @@ Evas_Object* win;
Evas_Object* _tab_curr; Evas_Object* _tab_curr;
extern Evas_Object* tab_home; extern Evas_Object* tab_home;
extern Evas_Object* tab_replays; extern Evas_Object* tab_replays;
Evas_Object* tab_scroller;
Evas_Object* _tabs[] = { NULL, NULL }; Evas_Object* _tabs[] = { NULL, NULL };
Evas_Object* _scrollers[] = { NULL, NULL };
int _tabs_len = 2; int _tabs_len = 2;
int _tabs_i = 0; // home int _tabs_i = 0; // home
Evas_Object* tab_config; Evas_Object* tab_config;
@ -85,6 +87,7 @@ update_tab(Evas_Object* newtab)
if (newtab) if (newtab)
{ {
_tab_curr = newtab; _tab_curr = newtab;
tab_scroller = _tab_curr;
evas_object_size_hint_weight_set(_tab_curr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_weight_set(_tab_curr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(mainer); evas_object_show(mainer);
evas_object_show(_tab_curr); evas_object_show(_tab_curr);
@ -108,7 +111,8 @@ void
_launch_slippi_job_end_cb(void *data, Ecore_Thread *thread) _launch_slippi_job_end_cb(void *data, Ecore_Thread *thread)
{ {
//Re-enable button so we can start again //Re-enable button so we can start again
elm_object_disabled_set(data, EINA_FALSE); if (data)
elm_object_disabled_set(data, EINA_FALSE);
} }
// Need to fork in a thread or EFL spergs out // Need to fork in a thread or EFL spergs out

View File

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