[GTK3] Implement rewind, turbo and slow-motion
This commit is contained in:
parent
37ce0958cb
commit
795c6ae8fa
36
gtk3/main.c
36
gtk3/main.c
@ -860,6 +860,27 @@ static gboolean on_key_press(GtkWidget *w, GdkEventKey *event, gpointer data) {
|
|||||||
case GDK_KEY_k: mask = BUTTON_MASK_B; break;
|
case GDK_KEY_k: mask = BUTTON_MASK_B; break;
|
||||||
case GDK_KEY_l: mask = BUTTON_MASK_A; break;
|
case GDK_KEY_l: mask = BUTTON_MASK_A; break;
|
||||||
|
|
||||||
|
case GDK_KEY_Tab: {
|
||||||
|
rewind_down = event->type == GDK_KEY_PRESS;
|
||||||
|
GB_set_turbo_mode(&gb, turbo_down, turbo_down && rewind_down);
|
||||||
|
|
||||||
|
if (event->type == GDK_KEY_RELEASE) {
|
||||||
|
rewind_paused = false;
|
||||||
|
}
|
||||||
|
break; }
|
||||||
|
|
||||||
|
case GDK_KEY_space: {
|
||||||
|
turbo_down = event->type == GDK_KEY_PRESS;
|
||||||
|
SDL_ClearQueuedAudio(device_id);
|
||||||
|
GB_set_turbo_mode(&gb, turbo_down, turbo_down && rewind_down);
|
||||||
|
break; }
|
||||||
|
|
||||||
|
case GDK_KEY_dead_acute: // fall through
|
||||||
|
case GDK_KEY_acute: // fall through
|
||||||
|
case GDK_KEY_apostrophe:
|
||||||
|
underclock_down = event->type == GDK_KEY_PRESS;
|
||||||
|
break;
|
||||||
|
|
||||||
case GDK_KEY_F11: {
|
case GDK_KEY_F11: {
|
||||||
if (event->type == GDK_KEY_RELEASE) {
|
if (event->type == GDK_KEY_RELEASE) {
|
||||||
if (is_fullscreen) {
|
if (is_fullscreen) {
|
||||||
@ -869,7 +890,7 @@ static gboolean on_key_press(GtkWidget *w, GdkEventKey *event, gpointer data) {
|
|||||||
gtk_window_fullscreen(GTK_WINDOW(main_window));
|
gtk_window_fullscreen(GTK_WINDOW(main_window));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
break; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event->type == GDK_KEY_PRESS) {
|
if (event->type == GDK_KEY_PRESS) {
|
||||||
@ -1405,6 +1426,7 @@ G_MODULE_EXPORT void on_keep_aspect_ratio_changed(GtkWidget *w, gpointer user_da
|
|||||||
G_MODULE_EXPORT void on_rewind_duration_changed(GtkWidget *w, gpointer user_data_gptr) {
|
G_MODULE_EXPORT void on_rewind_duration_changed(GtkWidget *w, gpointer user_data_gptr) {
|
||||||
GtkComboBox *box = GTK_COMBO_BOX(w);
|
GtkComboBox *box = GTK_COMBO_BOX(w);
|
||||||
config.rewind_duration = g_ascii_strtoll(gtk_combo_box_get_active_id(box), NULL, 10);
|
config.rewind_duration = g_ascii_strtoll(gtk_combo_box_get_active_id(box), NULL, 10);
|
||||||
|
GB_set_rewind_length(&gb, config.rewind_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
G_MODULE_EXPORT void on_sample_rate_changed(GtkWidget *w, gpointer user_data_gptr) {
|
G_MODULE_EXPORT void on_sample_rate_changed(GtkWidget *w, gpointer user_data_gptr) {
|
||||||
@ -1805,6 +1827,17 @@ static void vblank(GB_gameboy_t *gb) {
|
|||||||
GB_set_pixels_output(gb, get_pixels());
|
GB_set_pixels_output(gb, get_pixels());
|
||||||
|
|
||||||
g_idle_add((GSourceFunc) on_vblank, NULL);
|
g_idle_add((GSourceFunc) on_vblank, NULL);
|
||||||
|
|
||||||
|
if (underclock_down && clock_mutliplier > 0.5) {
|
||||||
|
clock_mutliplier -= 1.0/16;
|
||||||
|
GB_set_clock_multiplier(gb, clock_mutliplier);
|
||||||
|
}
|
||||||
|
else if (!underclock_down && clock_mutliplier < 1.0) {
|
||||||
|
clock_mutliplier += 1.0/16;
|
||||||
|
GB_set_clock_multiplier(gb, clock_mutliplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
do_rewind = rewind_down;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void run(GuiData *gui_data) {
|
static void run(GuiData *gui_data) {
|
||||||
@ -1985,6 +2018,7 @@ static void start(GuiData *gui_data) {
|
|||||||
while (running) {
|
while (running) {
|
||||||
if (rewind_paused) {
|
if (rewind_paused) {
|
||||||
handle_events(&gb);
|
handle_events(&gb);
|
||||||
|
g_usleep(G_USEC_PER_SEC / 8);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (do_rewind) {
|
if (do_rewind) {
|
||||||
|
Loading…
Reference in New Issue
Block a user