📄 buttons.c
字号:
/* SPIM S20 MIPS simulator. X interface to SPIM (Derived from an earlier work by Alan Siow.) Copyright (C) 1990-2004 by James Larus (larus@cs.wisc.edu). ALL RIGHTS RESERVED. SPIM is distributed under the following conditions: You may make copies of SPIM for your own use and modify those copies. All copies of SPIM must retain my name and copyright notice. You may not sell SPIM or distributed SPIM in conjunction with a commerical product or service without the expressed written consent of James Larus. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *//* $Header: /Software/SPIM/src/buttons.c 16 3/21/04 2:05p Larus $ */#include <X11/Intrinsic.h>#include <X11/StringDefs.h>#include <X11/Shell.h>#include <X11/Xaw/Form.h>#include <X11/Xaw/AsciiText.h>#include <X11/Xaw/Command.h>#include <X11/Xaw/Dialog.h>#include <X11/Xaw/Label.h>#include <X11/Xaw/MenuButton.h>#include <X11/Xaw/SimpleMenu.h>#include <X11/Xaw/Sme.h>#include <X11/Xaw/SmeBSB.h>#include <X11/Xaw/Cardinals.h>#include <stdio.h>#include <setjmp.h>#include <ctype.h>#include "spim.h"#include "string-stream.h"#include "spim-utils.h"#include "xspim.h"#include "inst.h"#include "reg.h"#include "mem.h"#include "scanner.h"#include "sym-tbl.h"#include "buttons.h"/* Local functions: */static void add_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data);static void add_clear_button (Widget parent);static void add_mode_button (Widget parent);static void add_reload_button (Widget parent);static void add_print_button (Widget parent);static void add_terminal_button (Widget parent);static void breakpoint_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void breakpoint_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void clear_program_state_action (Widget w, XtPointer client_data, XtPointer call_data);static void continue_action (Widget w, XtPointer client_data, XtPointer call_data);static void continue_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void delete_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data);static void destroy_popup_prompt (Widget w, XtPointer client_data, XtPointer call_data);static void help_action (Widget w, XtPointer ignore, XtPointer ignored);static void init_stack (char *args);static void load_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void load_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void list_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data);static void noop ();static void parse_print_value (Widget w, XtPointer client_data, XtPointer call_data);static void parse_set_value (Widget w, XtPointer client_data, XtPointer call_data);static Widget popup_two_field_dialog (Widget button, String name, String field1_label, String field1_value, String field2_label, String field2_value, String action_name, void (*action) (/* ??? */), String action2_name, void (*action2) (/* ??? */), Widget *field1_text, Widget *field2_text);static void print_mem_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void print_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void print_symbol_action (Widget w, XtPointer client_data, XtPointer call_data);static void quit_action (Widget w, XtPointer client_data,XtPointer call_data);static void quit_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void quit_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void read_assm_file_action (Widget w, XtPointer client_data, XtPointer call_data);static void reload_action (Widget w, XtPointer client_data, XtPointer call_data);static void run_program_action (Widget w, XtPointer client_data, XtPointer call_data);static void run_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void run_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void select_mode_action (Widget w, XtPointer client_data, XtPointer call_data);static void set_value_action (char *location_str,char *value_str);static void set_value_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void set_value_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void step_continue_action (Widget w, XtPointer client_data, XtPointer call_data);static void step_program_action (Widget w, XtPointer client_data, XtPointer call_data);static void step_prompt (Widget button, XtPointer client_data, XtPointer call_data);static void step_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data);static void warp_to_second_dialog (Widget widget, XEvent *event, String *params, Cardinal *num_params);/* Local variables: */static Widget breakpointButton;static void (*confirmAction) () = noop;static int stack_initialized = 0;char *xspim_file_name = NULL; /* Retain last file's name. */voidrecord_file_name_for_prompt (char *name){ xspim_file_name = str_copy (name);}voidcreate_buttons (Widget parent){ Widget button; Widget command; Arg args[10]; XtSetArg (args[0], XtNlabel, "quit"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("quitbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, quit_prompt, NULL); XtSetArg (args[0], XtNlabel, "load"); XtSetArg (args[1], XtNwidth, button_width); command = XtCreateManagedWidget ("loadbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (command, XtNcallback, load_prompt, NULL); add_reload_button (parent); XtSetArg (args[0], XtNlabel, "run"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("runbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, run_prompt, NULL); XtSetArg (args[0], XtNlabel, "step"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("stepbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, step_prompt, NULL); add_clear_button (parent); XtSetArg (args[0], XtNlabel, "set value"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("setvaluebutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, set_value_prompt, NULL); add_print_button (parent); XtSetArg (args[0], XtNlabel, "breakpoints"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("bkptbutton", commandWidgetClass, parent, args, TWO); breakpointButton = button; XtAddCallback (button, XtNcallback, breakpoint_prompt, NULL); XtSetArg (args[0], XtNlabel, "help"); XtSetArg (args[1], XtNwidth, button_width); button = XtCreateManagedWidget ("helpbutton", commandWidgetClass, parent, args, TWO); XtAddCallback (button, XtNcallback, help_action, NULL); add_terminal_button (parent); add_mode_button (parent);}/* *** Quit *** */static Widget quit_popup = NULL;static voidquit_prompt (Widget button, XtPointer client_data, XtPointer call_data){ Widget parent, dialog; Arg args[10]; Position x, y; if (quit_popup == NULL) { parent = XtParent (button); XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y); XtSetArg (args[0], XtNx, x); XtSetArg (args[1], XtNy, y); quit_popup = XtCreatePopupShell ("prompt", transientShellWidgetClass, parent, args, TWO); XtAddCallback (quit_popup, XtNdestroyCallback, quit_prompt_destroyed, (XtPointer) 0); XtSetArg (args[0], XtNlabel, "quit?"); dialog = XtCreateManagedWidget ("quit", dialogWidgetClass, quit_popup, args, ONE); XawDialogAddButton (dialog, "quit", quit_action, (XtPointer) dialog); XawDialogAddButton (dialog, "abort command", destroy_popup_prompt, (XtPointer) dialog); } confirmAction = quit_action; XtPopup (quit_popup, XtGrabNone);}static voidquit_action (Widget w, XtPointer client_data, XtPointer call_data){ Widget dialog = (Widget) client_data; destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL); XtDestroyApplicationContext (XtWidgetToApplicationContext (w)); exit (0);}static voidquit_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data){ quit_popup = NULL;}/* *** Load *** */static Widget load_popup = NULL;static voidload_prompt (Widget button, XtPointer client_data, XtPointer call_data){ Widget parent, dialog; Arg args[10]; Position x, y; if (load_popup == NULL) { parent = XtParent (button); XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y); XtSetArg (args[0], XtNx, x); XtSetArg (args[1], XtNy, y); load_popup = XtCreatePopupShell ("popup", transientShellWidgetClass, parent, args, TWO); XtAddCallback (load_popup, XtNdestroyCallback, load_prompt_destroyed, (XtPointer) 0); if (xspim_file_name == NULL) xspim_file_name = str_copy (""); XtSetArg (args[0], XtNlabel, "input filename:"); XtSetArg (args[1], XtNvalue, xspim_file_name); dialog = XtCreateManagedWidget ("dialog", dialogWidgetClass, load_popup, args, TWO); XawDialogAddButton (dialog, "assembly file", read_assm_file_action, (XtPointer) dialog); XawDialogAddButton (dialog, "abort command", destroy_popup_prompt, (XtPointer) dialog); } confirmAction = read_assm_file_action; XtPopup (load_popup, XtGrabNone);}static voidread_assm_file_action (Widget w, XtPointer client_data, XtPointer call_data){ Widget dialog = (Widget) client_data; String value = XawDialogGetValueString (dialog); free (xspim_file_name); xspim_file_name = str_copy (value); read_file (value); destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);}static voidload_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data){ load_popup = NULL;}/* *** Run *** */static Widget run_popup = NULL;static Widget run_field1_text, run_field2_text;static voidrun_prompt (Widget button, XtPointer client_data, XtPointer call_data){ char sa[20]; if (run_popup == NULL) { sprintf (sa, "0x%08x", starting_address ()); run_popup = popup_two_field_dialog (button, "run program", "starting address:", sa, "args:", xspim_file_name, "ok", run_program_action, NULL, NULL, &run_field1_text, &run_field2_text); XtAddCallback (run_popup, XtNdestroyCallback, run_prompt_destroyed, (XtPointer) 0); } confirmAction = run_program_action; XtPopup (run_popup, XtGrabNone);}static voidrun_program_action (Widget w, XtPointer client_data, XtPointer call_data){ Arg args[10]; String value1, value2; Widget form = XtParent (w); mem_addr addr; XtSetArg (args[0], XtNstring, &value1); XtGetValues (run_field1_text, args, ONE); XtSetArg (args[0], XtNstring, &value2); XtGetValues (run_field2_text, args, ONE); destroy_popup_prompt (NULL, (XtPointer) form, NULL); init_stack (value2); addr = strtoul (value1, NULL, 0); if (addr > 0) start_program (addr);}static voidinit_stack (char *args){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -