[GTK3] Add debug console prompt

This commit is contained in:
Maximilian Mader 2019-10-14 23:46:03 +02:00
parent 539d574585
commit 6a4ae92d77
Signed by: Max
GPG Key ID: F71D56A3151C4FB3

View File

@ -72,6 +72,9 @@ static uint8_t oamHeight;
static uint8_t pressed_buttons; static uint8_t pressed_buttons;
static gboolean in_sync_input = false;
static gchar *last_console_input = NULL;
static GMutex debugger_input_mutex; static GMutex debugger_input_mutex;
static GCond debugger_input_cond; static GCond debugger_input_cond;
static GMutex console_output_lock; static GMutex console_output_lock;
@ -374,6 +377,7 @@ static void gb_audio_callback(GB_gameboy_t *gb, GB_sample_t *sample) {
static char *sync_console_input(GB_gameboy_t *gb) { static char *sync_console_input(GB_gameboy_t *gb) {
console_log(gb, "> ", 0); console_log(gb, "> ", 0);
in_sync_input = true;
g_mutex_lock(&debugger_input_mutex); g_mutex_lock(&debugger_input_mutex);
g_cond_wait(&debugger_input_cond, &debugger_input_mutex); g_cond_wait(&debugger_input_cond, &debugger_input_mutex);
@ -386,6 +390,13 @@ static char *sync_console_input(GB_gameboy_t *gb) {
g_mutex_unlock(&debugger_input_mutex); g_mutex_unlock(&debugger_input_mutex);
in_sync_input = false;
// clear sidebar
GtkTextView *sidebar_output = builder_get(GTK_TEXT_VIEW, "console_sidebar_output");
GtkTextBuffer *sidebar_text_buf = gtk_text_view_get_buffer(sidebar_output);
gtk_text_buffer_set_text(sidebar_text_buf, "", -1);
return input; return input;
} }
@ -1464,13 +1475,30 @@ G_MODULE_EXPORT void on_use_integer_scaling_changed(GtkWidget *w, gpointer user_
G_MODULE_EXPORT void console_on_enter(GtkWidget *w, gpointer user_data_gptr) { G_MODULE_EXPORT void console_on_enter(GtkWidget *w, gpointer user_data_gptr) {
GtkEntry *input = GTK_ENTRY(w); GtkEntry *input = GTK_ENTRY(w);
const gchar *_text = gtk_entry_get_text(input); const gchar *_text = gtk_entry_get_text(input);
const gchar *text = g_strdup(_text); gchar *text = g_strdup(_text);
gtk_entry_set_text(input, "");
if (g_strcmp0("", text) == 0 && g_strcmp0("", last_console_input) < 0) {
text = g_strdup(last_console_input);
}
else if (text) {
if (last_console_input != NULL) g_free(last_console_input);
last_console_input = g_strdup(text);
}
if (!in_sync_input) {
console_log(&gb, "> ", 0);
}
console_log(&gb, text, 0);
console_log(&gb, "\n", 0);
g_mutex_lock(&debugger_input_mutex); g_mutex_lock(&debugger_input_mutex);
g_ptr_array_add(debugger_input_queue, (gpointer)text); g_ptr_array_add(debugger_input_queue, (gpointer)text);
g_cond_signal(&debugger_input_cond); g_cond_signal(&debugger_input_cond);
g_mutex_unlock(&debugger_input_mutex); g_mutex_unlock(&debugger_input_mutex);
// clear input
gtk_entry_set_text(input, "");
} }
static uint32_t rgb_encode(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b) { static uint32_t rgb_encode(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b) {