📄 buttons.c
字号:
/* *** Breakpoints **** */static char *breakpoint_addr = NULL; /* Retain last breakpoint address */static Widget bkpt_popup = NULL;#ifdef __STDC__static voidbreakpoint_prompt (Widget button, XtPointer client_data, XtPointer call_data)#elsestatic voidbreakpoint_prompt (button, client_data, call_data) Widget button; XtPointer client_data, call_data;#endif{ Widget parent, dialog; Arg args[10]; Position x, y; if (bkpt_popup == NULL) { parent = XtParent (button); XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y); XtSetArg (args[0], XtNx, x); XtSetArg (args[1], XtNy, y); bkpt_popup = XtCreatePopupShell ("popup", transientShellWidgetClass, parent, args, TWO); if (breakpoint_addr == NULL) breakpoint_addr = str_copy (""); XtSetArg (args[0], XtNlabel, "address:"); XtSetArg (args[1], XtNvalue, breakpoint_addr); dialog = XtCreateManagedWidget ("dialog", dialogWidgetClass, bkpt_popup, args, TWO); XtAddCallback (bkpt_popup, XtNdestroyCallback, breakpoint_prompt_destroyed, (XtPointer) 0); XawDialogAddButton (dialog, "add", add_breakpoint_action, (XtPointer) dialog); XawDialogAddButton (dialog, "delete", delete_breakpoint_action, (XtPointer) dialog); XawDialogAddButton (dialog, "list", list_breakpoint_action, (XtPointer) dialog); XawDialogAddButton (dialog, "abort command", destroy_popup_prompt, (XtPointer) dialog); } confirmAction = add_breakpoint_action; XtPopup (bkpt_popup, XtGrabNone);}#ifdef __STDC__static voidadd_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidadd_breakpoint_action (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ Widget dialog = (Widget) client_data; String value = XawDialogGetValueString (dialog); mem_addr addr; free (breakpoint_addr); breakpoint_addr = str_copy (value); while (*breakpoint_addr == ' ') breakpoint_addr++; if (isdigit (*breakpoint_addr)) addr = strtoul (value, NULL, 0); else addr = find_symbol_address (breakpoint_addr); add_breakpoint (addr); destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);}#ifdef __STDC__static voiddelete_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voiddelete_breakpoint_action (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ Widget dialog = (Widget) client_data; String value = XawDialogGetValueString (dialog); mem_addr addr; free (breakpoint_addr); breakpoint_addr = str_copy (value); addr = strtoul (value, NULL, 0); delete_breakpoint (addr); destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);}#ifdef __STDC__static voidlist_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidlist_breakpoint_action (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ list_breakpoints ();}#ifdef __STDC__static voidbreakpoint_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidbreakpoint_prompt_destroyed (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ bkpt_popup = NULL;}/* *** Help *** */#ifdef __STDC__static voidhelp_action (Widget w, XtPointer ignore, XtPointer ignored)#elsestatic voidhelp_action (w, ignore, ignored) Widget w; XtPointer ignore; XtPointer ignored;#endif{ static char * msg = "\nSPIM is a MIPS R2000 simulator.\n\Copyright (C) 1990-2000 by James R. Larus, larus@cs.wisc.edu\n\n\quit -- Exit from the simulator\n\load -- Read a file into memory\n\run -- Execute a program\n\step -- Single-step through a program\n\clear -- Reinitialize registers or memory\n\set value -- Set the value in register or memory\n\print -- Print the value in register or memory\n\breakpoint -- Set or delete a breakpoint\n\help -- This message\n\terminal -- Raise or hide console window\n\mode -- Set SPIM operating modes\n"; write_output (message_out, msg);}/* *** Terminal *** */#ifdef __STDC__static voidadd_terminal_button (Widget parent)#elsestatic voidadd_terminal_button (parent) Widget parent;#endif{ Widget command, menu, entry; Arg args[2]; XtSetArg (args[0], XtNwidth, button_width); command = XtCreateManagedWidget ("terminal", menuButtonWidgetClass, parent, args, ONE); menu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, command, NULL, ZERO); entry = XtCreateManagedWidget ("popup console", smeBSBObjectClass, menu, args, ONE); XtAddCallback (entry, XtNcallback, popup_console, NULL);}/* *** Mode *** */static Widget modeCommand;#ifdef __STDC__static voidadd_mode_button (Widget parent)#elsestatic voidadd_mode_button (parent) Widget parent;#endif{ Widget menu, entry; Arg args[2]; XtSetArg (args[0], XtNwidth, button_width); modeCommand = XtCreateManagedWidget ("mode", menuButtonWidgetClass, parent, args, ONE); menu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, modeCommand, NULL, ZERO); XtSetArg (args[0], XtNleftMargin, 20); entry = XtCreateManagedWidget ("bare", smeBSBObjectClass, menu, args, ONE); XtAddCallback (entry, XtNcallback, select_mode_action, NULL); if (bare_machine) { XtSetArg (args[0], XtNleftBitmap, mark); XtSetValues (entry, args, ONE); } XtSetArg (args[0], XtNleftMargin, 20); entry = XtCreateManagedWidget ("quiet", smeBSBObjectClass, menu, args, ONE); XtAddCallback (entry, XtNcallback, select_mode_action, NULL); if (quiet) { XtSetArg (args[0], XtNleftBitmap, mark); XtSetValues (entry, args, ONE); }}#ifdef __STDC__static voidselect_mode_action (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidselect_mode_action (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ Arg args[10]; String name = XtName (w); if (streq (name, "bare")) { bare_machine = !bare_machine; if (bare_machine) XtSetArg (args[0], XtNleftBitmap, mark); else XtSetArg (args[0], XtNleftBitmap, None); XtSetValues (w, args, ONE); } else if (streq (name, "quiet")) { quiet = !quiet; if (quiet) XtSetArg (args[0], XtNleftBitmap, mark); else XtSetArg (args[0], XtNleftBitmap, None); XtSetValues (w, args, ONE); }}/* *** Continue *** */static Widget continue_popup = NULL;#ifdef __STDC__voidcontinue_prompt (int interrupt_seen)#elsevoidcontinue_prompt (interrupt_seen) int interrupt_seen;#endif{ Widget dialog; Arg args[10]; Position x, y; char msg[256]; if (continue_popup != NULL) XtDestroyWidget (continue_popup); XtTranslateCoords (breakpointButton, (Position) 0, (Position) 0, &x, &y); XtSetArg (args[0], XtNx, x); XtSetArg (args[1], XtNy, y); continue_popup = XtCreatePopupShell ("prompt", transientShellWidgetClass, breakpointButton, args, TWO); XtAddCallback (continue_popup, XtNdestroyCallback, continue_prompt_destroyed, (XtPointer) 0); if (interrupt_seen) sprintf (msg, "execution interrupt at 0x%08x", PC); else sprintf (msg, "breakpoint encountered at 0x%08x", PC); XtSetArg (args[0], XtNlabel, msg); dialog = XtCreateManagedWidget ("continue", dialogWidgetClass, continue_popup, args, ONE); XawDialogAddButton (dialog, "continue", continue_action, (XtPointer) dialog); XawDialogAddButton (dialog, "abort command", destroy_popup_prompt, (XtPointer) dialog); confirmAction = continue_action; XtPopup (continue_popup, XtGrabNone);}#ifdef __STDC__static voidcontinue_action (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidcontinue_action (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ Widget dialog = (Widget) client_data; XtPopdown (XtParent (dialog)); destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL); continue_popup = NULL; execute_program (PC, 1, 0, 1); /* Step over breakpoint */ execute_program (PC, DEFAULT_RUN_STEPS - 1, 0, 0);}#ifdef __STDC__static voidcontinue_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voidcontinue_prompt_destroyed (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ continue_popup = NULL;}#ifdef __STDC__voidconfirm (Widget widget, XEvent *event, String *params, Cardinal *num_params)#elsevoidconfirm (widget, event, params, num_params) Widget widget; XEvent *event; String *params; Cardinal *num_params;#endif{ Widget dialog = XtParent (widget); (*confirmAction) (widget, (XtPointer) dialog, (XtPointer) NULL);}#ifdef __STDC__static voiddestroy_popup_prompt (Widget w, XtPointer client_data, XtPointer call_data)#elsestatic voiddestroy_popup_prompt (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ Widget popup = XtParent ((Widget) client_data); confirmAction = noop; XtDestroyWidget (popup);}#ifdef __STDC__static voidnoop (void)#elsestatic voidnoop ()#endif{}#ifdef __STDC__static Widgetpopup_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)#elsestatic Widgetpopup_two_field_dialog (button, name, field1_label, field1_value, field2_label, field2_value, action_name, action, action2_name, action2, field1_text, field2_text) Widget button; String name, field1_label, field1_value, field2_label, field2_value, action_name, action2_name; void (*action) (), (*action2) (); Widget *field1_text, *field2_text;#endif{ Widget popup, form; Widget labelx, field1, field2; Widget button1, button2, cancelbutton; Widget parent = XtParent (button); Arg args[10]; Position x, y; static XtActionsRec action_table [] = {{"warp_to_second_dialog", warp_to_second_dialog},}; XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y); XtSetArg (args[0], XtNx, x); XtSetArg (args[1], XtNy, y); popup = XtCreatePopupShell ("prompt", transientShellWidgetClass, parent, args, TWO); form = XtCreateManagedWidget ("form", formWidgetClass, popup, NULL, ZERO); XtSetArg (args[0], XtNlabel, name); XtSetArg (args[1], XtNborderWidth, 0); labelx = XtCreateManagedWidget ("label", labelWidgetClass, form, args, TWO); XtSetArg (args[0], XtNfromVert, labelx); XtSetArg (args[1], XtNborderWidth, 0); XtSetArg (args[2], XtNlabel, field1_label); field1 = XtCreateManagedWidget ("field1", labelWidgetClass, form, args, THREE); XtSetArg (args[0], XtNfromHoriz, field1); XtSetArg (args[1], XtNfromVert, labelx); XtSetArg (args[2], XtNeditType, "edit"); XtSetArg (args[3], XtNstring, field1_value); XtSetArg (args[4], XtNtype, XawAsciiString); *field1_text = XtCreateManagedWidget ("field1_text", asciiTextWidgetClass, form, args, FIVE); XtOverrideTranslations (*field1_text, XtParseTranslationTable ("#override \n <Key>Return:warp_to_second_dialog()")); XtAppAddActions (app_context, action_table, XtNumber (action_table)); XtSetArg (args[0], XtNfromVert, *field1_text); XtSetArg (args[1], XtNborderWidth, 0); XtSetArg (args[2], XtNlabel, field2_label); field2 = XtCreateManagedWidget ("field2", labelWidgetClass, form, args, THREE); XtSetArg (args[0], XtNfromHoriz, field1); XtSetArg (args[1], XtNfromVert, *field1_text); XtSetArg (args[2], XtNeditType, "edit"); XtSetArg (args[3], XtNstring, field2_value); XtSetArg (args[4], XtNtype, XawAsciiString); *field2_text = XtCreateManagedWidget ("field2_text", asciiTextWidgetClass, form, args, FIVE); XtOverrideTranslations (*field2_text, XtParseTranslationTable ("#override \n <Key>Return: confirm()")); XtSetArg (args[0], XtNfromVert, *field2_text); button1 = XtCreateManagedWidget (action_name, commandWidgetClass, form, args, ONE); XtAddCallback (button1, XtNcallback, action, (XtPointer) form); if (action2 != NULL) { XtSetArg (args[0], XtNfromHoriz, button1); XtSetArg (args[1], XtNfromVert, *field2_text); button2 = XtCreateManagedWidget (action2_name, commandWidgetClass, form, args, TWO); XtAddCallback (button2, XtNcallback, action2, (XtPointer) form); } XtSetArg (args[0], XtNfromHoriz, action2 == NULL ? button1 : button2); XtSetArg (args[1], XtNfromVert, *field2_text); cancelbutton = XtCreateManagedWidget ("abort command", commandWidgetClass, form, args, TWO); XtAddCallback (cancelbutton, XtNcallback, destroy_popup_prompt, (XtPointer) form); return (popup);}#ifdef __STDC__static voidwarp_to_second_dialog (Widget widget, XEvent *event, String *params, Cardinal *num_params)#elsestatic voidwarp_to_second_dialog (widget, event, params, num_params) Widget widget; XEvent *event; String *params; Cardinal *num_params;#endif{ Widget form = XtParent (widget); Widget second_dialog; second_dialog = XtNameToWidget (form, "field2_text"); if (second_dialog) XWarpPointer (XtDisplay (second_dialog), None, XtWindow (second_dialog), 0, 0, 0, 0, 0, 10);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -