static void repaint() { int win = winner(); for (int i = 1; i <= 9; i++) { const char *name = 0; switch (board[i]) { case NO_ONE: name = "empty"; break; case PLAYER1: name = "circle"; break; case PLAYER2: name = "cross"; break; } assert(name != 0); Pixel foreground; Pixel background; XtVaGetValues(buttons[i], XmNforeground, &foreground, XmNbackground, &background, XtPointer(0)); if (win == NO_ONE || winning[i]) { if (board[i] == PLAYER1) foreground = color(buttons[i], "red4", BlackPixelOfScreen(XtScreen(buttons[i]))); else foreground = BlackPixelOfScreen(XtScreen(buttons[i])); } Pixmap p = XmGetPixmap(XtScreen(buttons[i]), XMST(name), foreground, background); XtVaSetValues(buttons[i], XmNlabelType, XmPIXMAP, XmNlabelPixmap, p, XmNlabelInsensitivePixmap, p, XtPointer(0)); XtSetSensitive(buttons[i], win == NO_ONE && board[i] == NO_ONE); } switch (win) { case PLAYER1: set_status("You win."); break; case PLAYER2: set_status(DDD_NAME " wins."); break; case CATSEYE: set_status("Cat's eye."); break; } }
// Tie a ComboBox to global history void tie_combo_box_to_history(Widget text, HistoryFilter filter) { combo_boxes[text] = filter; update_combo_box(text, filter); XtAddCallback(text, XmNdestroyCallback, RemoveComboBoxCB, XtPointer(0)); }
// Handle incremental searches; return true if processed static bool do_isearch(Widget, XmTextVerifyCallbackStruct *change) { if (isearch_state == ISEARCH_NONE) return false; string saved_isearch_string = isearch_string; bool processed = false; if (change->startPos == change->endPos) { // Character insertion string input = string(change->text->ptr, change->text->length); if (!input.contains('\n', -1)) { // Add to current search string isearch_string += input; processed = true; } } else if (change->endPos - change->startPos == 1) { // Backspace - remove last character from search string if (!isearch_string.empty()) isearch_string.after(int(isearch_string.length()) - 2) = ""; else clear_isearch(true, false); processed = true; } if (processed) { int history = -1; if (isearch_string.empty() || current_line().contains(isearch_string)) { // Search string found in current line history = -1; } else { history = search_history(isearch_string, int(isearch_state)); if (history < 0) { // Search string not found in history if (change->event != 0) XtCallActionProc(gdb_w, "beep", change->event, 0, 0); isearch_string = saved_isearch_string; } } // Make this a no-op if (!have_isearch_line) { isearch_line = current_line(); have_isearch_line = true; } // Redraw current line with appropriate prompt. XtAppAddTimeOut(XtWidgetToApplicationContext(gdb_w), 0, isearch_done, XtPointer(history)); // Upon the next call to gdbMotionCB(), clear ISearch mode, // unless it immediately follows this one. isearch_motion_ok = true; XtAppAddTimeOut(XtWidgetToApplicationContext(gdb_w), 10, set_isearch_motion_ok, XtPointer(false)); } return processed; }
void gdbHistoryCB(Widget w, XtPointer, XtPointer) { if (gdb_history_w) { manage_and_raise(gdb_history_w); return; } Arg args[10]; int arg; // Create history viewer arg = 0; gdb_history_w = verify(createTopLevelSelectionDialog(find_shell(w), "history_dialog", args, arg)); Delay::register_shell(gdb_history_w); XtUnmanageChild(XmSelectionBoxGetChild(gdb_history_w, XmDIALOG_OK_BUTTON)); XtUnmanageChild(XmSelectionBoxGetChild(gdb_history_w, XmDIALOG_TEXT)); XtUnmanageChild(XmSelectionBoxGetChild(gdb_history_w, XmDIALOG_SELECTION_LABEL)); gdb_commands_w = XmSelectionBoxGetChild(gdb_history_w, XmDIALOG_LIST); XtVaSetValues(gdb_commands_w, XmNselectionPolicy, XmSINGLE_SELECT, XtPointer(0)); XtAddCallback(gdb_commands_w, XmNsingleSelectionCallback, SelectHistoryCB, 0); XtAddCallback(gdb_commands_w, XmNmultipleSelectionCallback, SelectHistoryCB, 0); XtAddCallback(gdb_commands_w, XmNextendedSelectionCallback, SelectHistoryCB, 0); XtAddCallback(gdb_commands_w, XmNbrowseSelectionCallback, SelectHistoryCB, 0); XtAddCallback(gdb_history_w, XmNokCallback, gdbApplySelectionCB, 0); XtAddCallback(gdb_history_w, XmNapplyCallback, gdbApplySelectionCB, 0); XtAddCallback(gdb_history_w, XmNcancelCallback, DestroyThisCB, gdb_history_w); XtAddCallback(gdb_history_w, XmNhelpCallback, ImmediateHelpCB, 0); XtAddCallback(gdb_history_w, XmNdestroyCallback, HistoryDestroyedCB, XtPointer(gdb_history_w)); bool *selected = new bool[gdb_history.size() + 1]; for (int i = 0; i < gdb_history.size() + 1; i++) selected[i] = false; selected[gdb_current_history] = true; setLabelList(gdb_commands_w, gdb_history.values(), selected, gdb_history.size(), false, false); delete[] selected; set_history_from_line(current_line()); XmListSelectPos(gdb_commands_w, 0, False); XmListSetBottomPos(gdb_commands_w, 0); manage_and_raise(gdb_history_w); }
void gdbExamineCB(Widget w, XtPointer, XtPointer) { static Widget dialog = 0; if (dialog == 0) { Arg args[10]; Cardinal arg = 0; XtSetArg(args[arg], XmNautoUnmanage, False); arg++; dialog = verify(XmCreatePromptDialog(find_shell(w), XMST("examine_dialog"), args, arg)); Delay::register_shell(dialog); XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON)); XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_SELECTION_LABEL)); XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_TEXT)); arg = 0; XtSetArg(args[arg], XmNorientation, XmHORIZONTAL); arg++; XtSetArg(args[arg], XmNborderWidth, 0); arg++; XtSetArg(args[arg], XmNentryBorder, 0); arg++; XtSetArg(args[arg], XmNspacing, 0); arg++; XtSetArg(args[arg], XmNmarginWidth, 0); arg++; XtSetArg(args[arg], XmNmarginHeight, 0); arg++; Widget panel = MMcreateButtonPanel(dialog, "panel", examine_menu, args, arg); (void) panel; MMaddCallbacks(examine_menu); MMaddHelpCallback(examine_menu, ImmediateHelpCB); manage_child(unsigned_char_w, gdb->type() == GDB); manage_child(binary_w, gdb->type() == GDB); manage_child(address_format_w, gdb->type() == GDB); manage_child(wide_char_w, gdb->type() == DBX); manage_child(wide_string_w, gdb->type() == DBX); manage_child(long_w, gdb->type() == DBX); // Initialize: use `o' and `b' as default menu items XtCallActionProc(octal_w, "ArmAndActivate", (XEvent *)0, (String *)0, 0); XtCallActionProc(byte_w, "ArmAndActivate", (XEvent *)0, (String *)0, 0); tie_combo_box_to_history(address_w, arg_history_filter); XtAddCallback(dialog, XmNokCallback, PrintExaminedCB, XtPointer(0)); XtAddCallback(dialog, XmNapplyCallback, DisplayExaminedCB, XtPointer(0)); XtAddCallback(dialog, XmNcancelCallback, UnmanageThisCB, XtPointer(dialog)); XtAddCallback(dialog, XmNhelpCallback, ImmediateHelpCB, XtPointer(0)); } string arg = source_arg->get_string(); if (!is_file_pos(arg) && !arg.empty()) XmTextFieldSetString(address_w, XMST(arg.chars())); manage_and_raise(dialog); }