From 255315d93aa09845bb6ab0fea7e98c901a82dbe8 Mon Sep 17 00:00:00 2001 From: Raphael Assenat Date: Sat, 12 Sep 2015 14:11:00 -0400 Subject: [PATCH] Gtk gui (in progress) --- tool/gtk/Makefile | 26 ++ tool/gtk/gcn64cfg.glade | 745 ++++++++++++++++++++++++++++++++++++++++ tool/gtk/gcn64ctl_gui | Bin 0 -> 39080 bytes tool/gtk/main.c | 175 ++++++++++ 4 files changed, 946 insertions(+) create mode 100644 tool/gtk/Makefile create mode 100644 tool/gtk/gcn64cfg.glade create mode 100755 tool/gtk/gcn64ctl_gui create mode 100644 tool/gtk/main.c diff --git a/tool/gtk/Makefile b/tool/gtk/Makefile new file mode 100644 index 0000000..a2d8d87 --- /dev/null +++ b/tool/gtk/Makefile @@ -0,0 +1,26 @@ +CC=gcc +LD=$(CC) + +CFLAGS=-Wall -g `pkg-config --cflags hidapi-hidraw gtk+-3.0 gmodule-2.0` +LDFLAGS=`pkg-config --libs hidapi-hidraw gtk+-3.0 gmodule-2.0` + +PREFIX=/usr/local + +PROG=gcn64ctl_gui + +OBJS=main.o ../gcn64.o ../mempak.o ../gcn64lib.o + +.PHONY : clean install + +all: $(OBJS) + $(LD) $(LDFLAGS) $(OBJS) -o $(PROG) + +%.o: %.c %.h + $(CC) $(CFLAGS) -c $< + +clean: + rm -f *.o $(PROG) + +install: + @echo "Install not done yet. Sorry" + diff --git a/tool/gtk/gcn64cfg.glade b/tool/gtk/gcn64cfg.glade new file mode 100644 index 0000000..67c2d84 --- /dev/null +++ b/tool/gtk/gcn64cfg.glade @@ -0,0 +1,745 @@ + + + + + + + + + + False + dialog + GC/N64 to USB configurator + Copyright (C) 2015 Raphaël Assénat <raph@raphnet.net> + http://www.raphnet.net + http://www.raphnet.net + Raphaël Assénat + image-x-generic + gpl-3-0 + + + + False + vertical + 2 + + + False + end + + + False + False + 0 + + + + + + + + + + + + + + + + + + + + + + + *.hex + + + + 1 + 255 + 1 + 5 + + + False + GCN64CFG + + + + + True + False + 2 + 2 + 2 + 2 + vertical + + + True + False + + + True + False + _File + True + + + True + False + + + gtk-new + True + False + True + True + + + + + gtk-open + True + False + True + True + + + + + gtk-save + True + False + True + True + + + + + gtk-save-as + True + False + True + True + + + + + True + False + + + + + gtk-quit + True + False + True + True + + + + + + + + + + True + False + _Help + True + + + True + False + + + gtk-about + True + False + True + True + + + + + + + + + + False + True + 0 + + + + + True + False + + + True + False + Selected adapter: + + + False + True + 0 + + + + + True + False + adaptersList + 6 + on + 2 + + + + + 1 + + + + + + 0 + + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + False + vertical + + + True + False + 0 + in + + + True + False + 12 + + + True + False + + + True + False + end + Product name: + right + + + 0 + 0 + + + + + True + False + end + USB ID: + right + end + + + 0 + 2 + + + + + True + False + end + Firmware version: + right + + + 0 + 1 + + + + + True + False + + + 1 + 0 + + + + + True + False + + + 1 + 1 + + + + + True + False + + + 1 + 2 + + + + + + + + + True + False + Information and status: + + + + + False + True + 0 + + + + + True + False + + + True + False + 0 + in + + + True + False + 12 + + + True + False + vertical + + + N64 Square joystick + True + True + False + 0 + True + + + + False + True + 0 + + + + + GC Square main stick + True + True + False + 0 + True + + + + False + True + 1 + + + + + GC Square C-stick + True + True + False + 0 + True + + + + False + True + 2 + + + + + GC Full range sliders +(non-centered) + True + True + False + 0 + True + + + + False + True + 3 + + + + + GC Inverted triggers + True + True + False + 0 + 0.40999999642372131 + True + + + + False + True + 4 + + + + + True + False + + + True + False + 5 + Poll interval (ms): + + + False + True + 0 + + + + + True + True + 3 + False + 0.10000000000000001 + number + pollrate_adjustment + 1 + True + + + + False + True + 1 + + + + + False + True + 6 + + + + + + + + + True + False + Configuration + + + + + True + True + 4 + 0 + + + + + True + False + 0 + in + + + True + False + 12 + + + True + False + vertical + start + + + Suspend polling + True + True + True + 0.46000000834465027 + + + + True + True + 0 + + + + + Resume polling + True + True + True + + + + True + True + 1 + + + + + Update firmware... + True + True + True + + + + True + True + 2 + + + + + Read N64 mempak + True + True + True + + + True + True + 3 + + + + + + + + + True + False + Operations: + + + + + True + True + 3 + 1 + + + + + True + True + 1 + + + + + True + True + 2 + + + + + True + False + 10 + 10 + 10 + 10 + 6 + 6 + vertical + 2 + + + False + True + 3 + + + + + + + False + Select firmware file... + True + dialog + mainWindow + hexfilter + False + False + False + + + False + vertical + 2 + + + False + end + + + gtk-cancel + True + True + True + none + True + True + + + + True + True + 0 + + + + + gtk-open + True + True + True + True + 0.46000000834465027 + True + + + True + True + 1 + + + + + False + False + 0 + + + + + + + + + + False + Error + True + dialog-error + normal + mainWindow + question + Internal error + + + False + vertical + 2 + + + False + True + end + + + + + + gtk-close + True + True + True + True + 0.47999998927116394 + + + + True + True + 1 + + + + + False + False + 0 + + + + + + diff --git a/tool/gtk/gcn64ctl_gui b/tool/gtk/gcn64ctl_gui new file mode 100755 index 0000000000000000000000000000000000000000..ae57a93741397a854608eac24a2ff30ca5d957db GIT binary patch literal 39080 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 tuHsHHBf3tZyV literal 0 HcmV?d00001 diff --git a/tool/gtk/main.c b/tool/gtk/main.c new file mode 100644 index 0000000..347f1c8 --- /dev/null +++ b/tool/gtk/main.c @@ -0,0 +1,175 @@ +#include +#include +#include +#include "../gcn64.h" +#include "../gcn64lib.h" +#include "../../requests.h" + +#define GET_UI_ELEMENT(TYPE, ELEMENT) TYPE *ELEMENT = (TYPE *) \ + gtk_builder_get_object(app->builder, #ELEMENT); + +struct application { + GtkBuilder *builder; + gcn64_hdl_t current_adapter_handle; +}; + +static void updateGuiFromAdapter(struct application *app) +{ + unsigned char buf[32]; + int n; + + GtkSpinButton *pollInterval0 = GTK_SPIN_BUTTON( gtk_builder_get_object(app->builder, "pollInterval0") ); + + n = gcn64lib_getConfig(app->current_adapter_handle, CFG_PARAM_POLL_INTERVAL0, buf, sizeof(buf)); + if (n == 1) { + printf("poll interval: %d\n", buf[0]); + gtk_spin_button_set_value(pollInterval0, (gdouble)buf[0]); + } +} + +G_MODULE_EXPORT void pollIntervalChanged(GtkWidget *win, gpointer data) +{ + struct application *app = data; + GET_UI_ELEMENT(GtkSpinButton, pollInterval0); + gdouble value; + int n; + unsigned char buf; + + value = gtk_spin_button_get_value(pollInterval0); + printf("Value: %d\n", (int)value); + buf = (int)value; + + n = gcn64lib_setConfig(app->current_adapter_handle, CFG_PARAM_POLL_INTERVAL0, &buf, 1); +} + +G_MODULE_EXPORT void onMainWindowShow(GtkWidget *win, gpointer data) +{ + int res; + struct gcn64_list_ctx *listctx; + struct gcn64_info info; + struct application *app = data; + GtkListStore *list_store; + + res = gcn64_init(1); + if (res) { + GtkWidget *d = GTK_WIDGET( gtk_builder_get_object(app->builder, "internalError") ); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(d), "gcn64_init failed (returned %d)", res); + gtk_widget_show(d); + return; + } + + list_store = GTK_LIST_STORE( gtk_builder_get_object(app->builder, "adaptersList") ); + + printf("Listing device...\n"); + listctx = gcn64_allocListCtx(); + + while (gcn64_listDevices(&info, listctx)) { + GtkTreeIter iter; + printf("Device '%ls'\n", info.str_prodname); + gtk_list_store_append(list_store, &iter); + if (sizeof(wchar_t)==4) { + gtk_list_store_set(list_store, &iter, + 0, g_ucs4_to_utf8((void*)info.str_serial, -1, NULL, NULL, NULL), + 1, g_ucs4_to_utf8((void*)info.str_prodname, -1, NULL, NULL, NULL), + 3, g_memdup(&info, sizeof(struct gcn64_info)), + -1); + } else { + gtk_list_store_set(list_store, &iter, + 0, g_utf16_to_utf8((void*)info.str_serial, -1, NULL, NULL, NULL), + 1, g_utf16_to_utf8((void*)info.str_prodname, -1, NULL, NULL, NULL), + 3, g_memdup(&info, sizeof(struct gcn64_info)), + -1); + } +// gtk_list_store_set(list_store, &iter, 1, "asfasdfasdfasf", -1); + } + + gcn64_freeListCtx(listctx); +} + +G_MODULE_EXPORT void adapterSelected(GtkComboBox *cb, gpointer data) +{ + struct application *app = data; + GtkTreeIter iter; + GtkListStore *list_store = GTK_LIST_STORE( gtk_builder_get_object(app->builder, "adaptersList") ); + GtkWidget *adapter_details = GTK_WIDGET( gtk_builder_get_object(app->builder, "adapterDetails") ); + struct gcn64_info *info; + + if (!app->current_adapter_handle) { + gcn64_closeDevice(app->current_adapter_handle); + app->current_adapter_handle = NULL; + gtk_widget_set_sensitive(adapter_details, FALSE); + } + + if (gtk_combo_box_get_active_iter(cb, &iter)) { + gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, 3, &info, -1); + printf("%s\n", info->str_path); + + app->current_adapter_handle = gcn64_openDevice(info); + if (!app->current_adapter_handle) { + printf("Access error!\n"); + } + + updateGuiFromAdapter(app); + gtk_widget_set_sensitive(adapter_details, TRUE); + } +} + +G_MODULE_EXPORT void onMainWindowHide(GtkWidget *win, gpointer data) +{ + gcn64_shutdown(); +} + +G_MODULE_EXPORT void suspend_polling(GtkButton *button, gpointer data) +{ + struct application *app = data; + + gcn64lib_suspendPolling(app->current_adapter_handle, 1); +} + +G_MODULE_EXPORT void resume_polling(GtkButton *button, gpointer data) +{ + struct application *app = data; + + gcn64lib_suspendPolling(app->current_adapter_handle, 0); +} + +int +main( int argc, + char **argv ) +{ + GtkWidget *window; + GError *error = NULL; + struct application app = { }; + + /* Init GTK+ */ + gtk_init( &argc, &argv ); + + /* Create new GtkBuilder object */ + app.builder = gtk_builder_new(); + /* Load UI from file. If error occurs, report it and quit application. + * Replace "tut.glade" with your saved project. */ + if( ! gtk_builder_add_from_file( app.builder, "gcn64cfg.glade", &error ) ) + { + g_warning( "%s", error->message ); + g_free( error ); + return( 1 ); + } + + /* Get main window pointer from UI */ + window = GTK_WIDGET( gtk_builder_get_object( app.builder, "mainWindow" ) ); + + /* Connect signals */ + gtk_builder_connect_signals( app.builder, &app ); + + /* Destroy builder, since we don't need it anymore */ +// g_object_unref( G_OBJECT( builder ) ); + + /* Show window. All other widgets are automatically shown by GtkBuilder */ + gtk_widget_show( window ); + + /* Start main loop */ + gtk_main(); + + return( 0 ); +} +