Implement a basic properties window

This commit is contained in:
Pierre Pronchery 2015-08-21 02:57:14 +02:00
parent f32930d260
commit 4e3c6f943b

View File

@ -78,6 +78,7 @@ struct _Debugger
char * filename;
/* widgets */
PangoFontDescription * bold;
GtkWidget * window;
/* toolbar */
/* disassembly */
@ -114,6 +115,7 @@ static void _debugger_on_continue(gpointer data);
static void _debugger_on_next(gpointer data);
static void _debugger_on_open(gpointer data);
static void _debugger_on_pause(gpointer data);
static void _debugger_on_properties(gpointer data);
static void _debugger_on_run(gpointer data);
static void _debugger_on_step(gpointer data);
static void _debugger_on_stop(gpointer data);
@ -131,6 +133,9 @@ static DesktopMenu const _debugger_menu_file[] =
{ N_("_Open..."), G_CALLBACK(_debugger_on_open), GTK_STOCK_OPEN,
GDK_CONTROL_MASK, GDK_KEY_O },
{ "", NULL, NULL, 0, 0 },
{ N_("_Properties"), G_CALLBACK(_debugger_on_properties),
GTK_STOCK_PROPERTIES, GDK_MOD1_MASK, GDK_KEY_Return },
{ "", NULL, NULL, 0, 0 },
{ N_("_Close"), G_CALLBACK(_debugger_on_close), GTK_STOCK_CLOSE,
GDK_CONTROL_MASK, GDK_KEY_W },
{ NULL, NULL, NULL, 0, 0 }
@ -161,6 +166,7 @@ static DesktopMenubar const _debugger_menubar[] =
#define DEBUGGER_TOOLBAR_STOP 6
#define DEBUGGER_TOOLBAR_STEP 7
#define DEBUGGER_TOOLBAR_NEXT 8
#define DEBUGGER_TOOLBAR_PROPERTIES 10
static DesktopToolbar _debugger_toolbar[] =
{
{ N_("Open"), G_CALLBACK(_debugger_on_open), GTK_STOCK_OPEN,
@ -179,6 +185,9 @@ static DesktopToolbar _debugger_toolbar[] =
GTK_STOCK_MEDIA_FORWARD, 0, 0, NULL },
{ N_("Next"), G_CALLBACK(_debugger_on_next),
GTK_STOCK_MEDIA_NEXT, 0, 0, NULL },
{ "", NULL, NULL, 0, 0, NULL },
{ N_("Properties"), G_CALLBACK(_debugger_on_properties),
GTK_STOCK_PROPERTIES, 0, 0, NULL },
{ NULL, NULL, NULL, 0, 0, NULL }
};
@ -228,6 +237,8 @@ Debugger * debugger_new(void)
return NULL;
}
/* widgets */
debugger->bold = pango_font_description_new();
pango_font_description_set_weight(debugger->bold, PANGO_WEIGHT_BOLD);
accel = gtk_accel_group_new();
debugger->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_add_accel_group(GTK_WINDOW(debugger->window), accel);
@ -298,6 +309,7 @@ void debugger_delete(Debugger * debugger)
debugger_stop(debugger);
free(debugger->filename);
gtk_widget_destroy(debugger->window);
pango_font_description_free(debugger->bold);
object_delete(debugger);
}
@ -571,6 +583,75 @@ int debugger_pause(Debugger * debugger)
}
/* debugger_properties */
static GtkWidget * _properties_label(Debugger * debugger, GtkSizeGroup * group,
char const * label, char const * value);
void debugger_properties(Debugger * debugger)
{
const unsigned int flags = GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT;
GtkSizeGroup * group;
GtkWidget * dialog;
GtkWidget * vbox;
GtkWidget * widget;
String * s;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
if(debugger_is_opened(debugger) == FALSE)
return;
group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
dialog = gtk_dialog_new_with_buttons(_("Properties"),
GTK_WINDOW(debugger->window), flags,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
if((s = string_new_format(_("Properties of %s"), debugger->filename))
!= NULL)
gtk_window_set_title(GTK_WINDOW(dialog), s);
string_delete(s);
#if GTK_CHECK_VERSION(2, 14, 0)
vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
#else
vbox = GTK_DIALOG(dialog)->vbox;
#endif
/* FIXME really implement */
/* architecture */
widget = _properties_label(debugger, group, _("Architecture: "),
debugger->bdefinition->arch_get_name(debugger->backend));
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
/* format */
widget = _properties_label(debugger, group, _("Format: "),
debugger->bdefinition->format_get_name(debugger->backend));
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
gtk_widget_show_all(vbox);
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
static GtkWidget * _properties_label(Debugger * debugger, GtkSizeGroup * group,
char const * label, char const * value)
{
GtkWidget * hbox;
GtkWidget * widget;
#if GTK_CHECK_VERSION(3, 0, 0)
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
#else
hbox = gtk_hbox_new(FALSE, 4);
#endif
widget = gtk_label_new(label);
gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5);
gtk_widget_modify_font(widget, debugger->bold);
gtk_size_group_add_widget(group, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
widget = gtk_label_new((value != NULL) ? value : "");
gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
return hbox;
}
/* debugger_run */
int debugger_run(Debugger * debugger, ...)
{
@ -653,15 +734,18 @@ static void _debugger_set_sensitive_toolbar(Debugger * debugger, gboolean run,
DEBUGGER_TOOLBAR_STEP,
DEBUGGER_TOOLBAR_NEXT
};
GtkWidget * widget;
size_t i;
gtk_widget_set_sensitive(GTK_WIDGET(
_debugger_toolbar[DEBUGGER_TOOLBAR_RUN].widget),
run);
widget = GTK_WIDGET(_debugger_toolbar[DEBUGGER_TOOLBAR_RUN].widget);
gtk_widget_set_sensitive(widget, run);
for(i = 0; i < sizeof(widgets) / sizeof(*widgets); i++)
gtk_widget_set_sensitive(GTK_WIDGET(
_debugger_toolbar[widgets[i]].widget),
debug);
widget = GTK_WIDGET(_debugger_toolbar[DEBUGGER_TOOLBAR_PROPERTIES]
.widget);
gtk_widget_set_sensitive(widget, debugger_is_opened(debugger));
}
@ -842,6 +926,15 @@ static void _debugger_on_pause(gpointer data)
}
/* debugger_on_properties */
static void _debugger_on_properties(gpointer data)
{
Debugger * debugger = data;
debugger_properties(debugger);
}
/* debugger_on_run */
static void _debugger_on_run(gpointer data)
{