Add a first toolbar
This commit is contained in:
parent
8e3cf6d840
commit
b98c34dc60
@ -69,7 +69,7 @@ static int _error(char const * message, int ret)
|
||||
/* usage */
|
||||
static int _usage(void)
|
||||
{
|
||||
fprintf(stderr, _("Usage: %s\n"), PROGNAME);
|
||||
fprintf(stderr, _("Usage: %s [filename]\n"), PROGNAME);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -93,13 +93,15 @@ int main(int argc, char * argv[])
|
||||
default:
|
||||
return _usage();
|
||||
}
|
||||
if(optind != argc)
|
||||
if(optind != argc && optind + 1 != argc)
|
||||
return _usage();
|
||||
if((debugger = debugger_new()) == NULL)
|
||||
{
|
||||
error_print(PROGNAME);
|
||||
return 2;
|
||||
}
|
||||
if(argv[optind] != NULL)
|
||||
debugger_open(debugger, NULL, NULL, argv[optind]);
|
||||
gtk_main();
|
||||
debugger_delete(debugger);
|
||||
return 0;
|
||||
|
222
tools/debugger.c
222
tools/debugger.c
@ -27,11 +27,23 @@ static char const _debugger_license[] =
|
||||
|
||||
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <libintl.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdkkeysyms.h>
|
||||
#include <System.h>
|
||||
#include <Desktop.h>
|
||||
#include "debugger.h"
|
||||
#define _(string) gettext(string)
|
||||
#define N_(string) (string)
|
||||
|
||||
#ifndef PREFIX
|
||||
# define PREFIX "/usr/local"
|
||||
#endif
|
||||
#ifndef LIBDIR
|
||||
# define LIBDIR PREFIX "/lib"
|
||||
#endif
|
||||
|
||||
|
||||
/* Debugger */
|
||||
@ -54,6 +66,21 @@ struct _Debugger
|
||||
static void _debugger_on_close(gpointer data);
|
||||
static gboolean _debugger_on_closex(gpointer data);
|
||||
|
||||
static void _debugger_on_open(gpointer data);
|
||||
static void _debugger_on_run(gpointer data);
|
||||
|
||||
|
||||
/* variables */
|
||||
static DesktopToolbar _debugger_toolbar[] =
|
||||
{
|
||||
{ N_("Open"), G_CALLBACK(_debugger_on_open), GTK_STOCK_OPEN,
|
||||
GDK_CONTROL_MASK, GDK_KEY_O, NULL },
|
||||
{ "", NULL, NULL, 0, 0, NULL },
|
||||
{ N_("Run"), G_CALLBACK(_debugger_on_run), GTK_STOCK_EXECUTE, 0,
|
||||
GDK_KEY_F10, NULL },
|
||||
{ NULL, NULL, NULL, 0, 0, NULL }
|
||||
};
|
||||
|
||||
|
||||
/* public */
|
||||
/* functions */
|
||||
@ -61,6 +88,7 @@ static gboolean _debugger_on_closex(gpointer data);
|
||||
Debugger * debugger_new(void)
|
||||
{
|
||||
Debugger * debugger;
|
||||
GtkAccelGroup * accel;
|
||||
GtkWidget * vbox;
|
||||
GtkWidget * paned;
|
||||
GtkWidget * widget;
|
||||
@ -69,14 +97,23 @@ Debugger * debugger_new(void)
|
||||
|
||||
if((debugger = object_new(sizeof(*debugger))) == NULL)
|
||||
return NULL;
|
||||
accel = gtk_accel_group_new();
|
||||
debugger->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_add_accel_group(GTK_WINDOW(debugger->window), accel);
|
||||
gtk_window_set_default_size(GTK_WINDOW(debugger->window), 640, 480);
|
||||
gtk_window_set_title(GTK_WINDOW(debugger->window), _("Debugger"));
|
||||
g_signal_connect_swapped(debugger->window, "delete-event", G_CALLBACK(
|
||||
_debugger_on_closex), debugger);
|
||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
|
||||
#else
|
||||
vbox = gtk_vbox_new(FALSE, 0);
|
||||
#endif
|
||||
/* menubar */
|
||||
/* toolbar */
|
||||
widget = desktop_toolbar_create(_debugger_toolbar, debugger, accel);
|
||||
g_object_unref(accel);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
|
||||
/* view */
|
||||
paned = gtk_hpaned_new();
|
||||
/* assembly */
|
||||
@ -118,6 +155,173 @@ void debugger_delete(Debugger * debugger)
|
||||
}
|
||||
|
||||
|
||||
/* useful */
|
||||
/* debugger_open */
|
||||
int debugger_open(Debugger * debugger, char const * arch, char const * format,
|
||||
char const * filename)
|
||||
{
|
||||
if(filename == NULL)
|
||||
return debugger_open_dialog(debugger, arch, format);
|
||||
/* FIXME implement */
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* debugger_open_dialog */
|
||||
static void _open_dialog_type(GtkWidget * combobox, char const * type,
|
||||
char const * value);
|
||||
|
||||
int debugger_open_dialog(Debugger * debugger, char const * arch,
|
||||
char const * format)
|
||||
{
|
||||
int ret = 0;
|
||||
GtkWidget * dialog;
|
||||
GtkWidget * vbox;
|
||||
GtkWidget * hbox;
|
||||
GtkWidget * awidget;
|
||||
GtkWidget * fwidget;
|
||||
GtkWidget * widget;
|
||||
GtkFileFilter * filter;
|
||||
char * a = NULL;
|
||||
char * f = NULL;
|
||||
char * filename = NULL;
|
||||
|
||||
dialog = gtk_file_chooser_dialog_new(_("Open file..."),
|
||||
GTK_WINDOW(debugger->window),
|
||||
GTK_FILE_CHOOSER_ACTION_OPEN,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
|
||||
#if GTK_CHECK_VERSION(2, 14, 0)
|
||||
vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
||||
#else
|
||||
vbox = GTK_DIALOG(dialog)->vbox;
|
||||
#endif
|
||||
/* arch */
|
||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
|
||||
#else
|
||||
hbox = gtk_hbox_new(FALSE, 4);
|
||||
#endif
|
||||
awidget = gtk_combo_box_new_text();
|
||||
gtk_combo_box_append_text(GTK_COMBO_BOX(awidget), _("Auto-detect"));
|
||||
_open_dialog_type(awidget, "arch", arch);
|
||||
gtk_box_pack_end(GTK_BOX(hbox), awidget, FALSE, TRUE, 0);
|
||||
widget = gtk_label_new(_("Architecture:"));
|
||||
gtk_box_pack_end(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
|
||||
/* format */
|
||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
|
||||
#else
|
||||
hbox = gtk_hbox_new(FALSE, 4);
|
||||
#endif
|
||||
fwidget = gtk_combo_box_new_text();
|
||||
gtk_combo_box_append_text(GTK_COMBO_BOX(fwidget), _("Auto-detect"));
|
||||
_open_dialog_type(fwidget, "format", format);
|
||||
gtk_box_pack_end(GTK_BOX(hbox), fwidget, FALSE, TRUE, 0);
|
||||
widget = gtk_label_new(_("File format:"));
|
||||
gtk_box_pack_end(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
|
||||
gtk_widget_show_all(vbox);
|
||||
/* executable files */
|
||||
filter = gtk_file_filter_new();
|
||||
gtk_file_filter_set_name(filter, _("Executable files"));
|
||||
gtk_file_filter_add_mime_type(filter, "application/x-executable");
|
||||
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
|
||||
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
|
||||
/* all files */
|
||||
filter = gtk_file_filter_new();
|
||||
gtk_file_filter_set_name(filter, _("All files"));
|
||||
gtk_file_filter_add_pattern(filter, "*");
|
||||
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
|
||||
if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
|
||||
{
|
||||
if(gtk_combo_box_get_active(GTK_COMBO_BOX(awidget)) == 0)
|
||||
a = NULL;
|
||||
else
|
||||
a = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
|
||||
awidget));
|
||||
if(gtk_combo_box_get_active(GTK_COMBO_BOX(fwidget)) == 0)
|
||||
f = NULL;
|
||||
else
|
||||
f = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
|
||||
fwidget));
|
||||
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(
|
||||
dialog));
|
||||
}
|
||||
gtk_widget_destroy(dialog);
|
||||
if(filename != NULL)
|
||||
ret = debugger_open(debugger, a, f, filename);
|
||||
g_free(a);
|
||||
g_free(f);
|
||||
g_free(filename);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void _open_dialog_type(GtkWidget * combobox, char const * type,
|
||||
char const * value)
|
||||
{
|
||||
char * path;
|
||||
DIR * dir;
|
||||
struct dirent * de;
|
||||
#ifdef __APPLE__
|
||||
char const ext[] = ".dylib";
|
||||
#else
|
||||
char const ext[] = ".so";
|
||||
#endif
|
||||
size_t len;
|
||||
int i;
|
||||
int active = 0;
|
||||
|
||||
if((path = g_build_filename(LIBDIR, "Asm", type, NULL)) == NULL)
|
||||
return;
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "DEBUG: %s(%s) \"%s\"\n", __func__, type, path);
|
||||
#endif
|
||||
dir = opendir(path);
|
||||
g_free(path);
|
||||
if(dir == NULL)
|
||||
return;
|
||||
for(i = 0; (de = readdir(dir)) != NULL; i++)
|
||||
{
|
||||
if(strcmp(de->d_name, ".") == 0
|
||||
|| strcmp(de->d_name, "..") == 0)
|
||||
continue;
|
||||
if((len = strlen(de->d_name)) < sizeof(ext))
|
||||
continue;
|
||||
if(strcmp(&de->d_name[len - sizeof(ext) + 1], ext) != 0)
|
||||
continue;
|
||||
de->d_name[len - sizeof(ext) + 1] = '\0';
|
||||
gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), de->d_name);
|
||||
if(value != NULL && strcmp(de->d_name, value) == 0)
|
||||
active = i;
|
||||
}
|
||||
closedir(dir);
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), active);
|
||||
}
|
||||
|
||||
|
||||
/* debugger_run */
|
||||
int debugger_run(Debugger * debugger, ...)
|
||||
{
|
||||
int ret;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, debugger);
|
||||
ret = debugger_runv(debugger, ap);
|
||||
va_end(ap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* debugger_runv */
|
||||
int debugger_runv(Debugger * debugger, va_list ap)
|
||||
{
|
||||
/* FIXME implement */
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* callbacks */
|
||||
/* debugger_on_close */
|
||||
static void _debugger_on_close(gpointer data)
|
||||
@ -137,3 +341,21 @@ static gboolean _debugger_on_closex(gpointer data)
|
||||
_debugger_on_close(debugger);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* debugger_on_open */
|
||||
static void _debugger_on_open(gpointer data)
|
||||
{
|
||||
Debugger * debugger = data;
|
||||
|
||||
debugger_open_dialog(debugger, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
/* debugger_on_run */
|
||||
static void _debugger_on_run(gpointer data)
|
||||
{
|
||||
Debugger * debugger = data;
|
||||
|
||||
debugger_run(debugger);
|
||||
}
|
||||
|
@ -45,7 +45,8 @@ void debugger_delete(Debugger * debugger);
|
||||
/* useful */
|
||||
int debugger_open(Debugger * debugger, char const * arch, char const * format,
|
||||
char const * filename);
|
||||
int debugger_open_dialog(Debugger * debugger);
|
||||
int debugger_open_dialog(Debugger * debugger, char const * arch,
|
||||
char const * format);
|
||||
|
||||
int debugger_run(Debugger * debugger, ...);
|
||||
int debugger_runv(Debugger * debugger, va_list ap);
|
||||
|
Loading…
Reference in New Issue
Block a user