static void update_sources(Widget sources, Widget filter) { StatusDelay delay("Getting sources"); get_gdb_sources(all_sources); String pattern_s = XmTextFieldGetString(filter); string pattern = pattern_s; XtFree(pattern_s); strip_space(pattern); if (pattern.empty()) pattern = "*"; XmTextFieldSetString(filter, XMST(pattern.chars())); StringArray labels; uniquify(all_sources, labels); // Sort and remove duplicates sort(labels, all_sources); uniq(labels, all_sources); // Filter pattern filter_sources(labels, all_sources, pattern); // Now set the selection. bool *selected = new bool[labels.size()]; for (int i = 0; i < labels.size(); i++) selected[i] = false; setLabelList(sources, labels.values(), selected, labels.size(), false, false); delete[] selected; }
// Update list of arguments static void update_arguments(Widget dialog, Widget arguments_w, StringArray& arguments, const string& last, bool& updated) { if (updated || dialog == 0) return; bool *selected = new bool[arguments.size()]; int pos = -1; for (int i = 0; i < arguments.size(); i++) { if (arguments[i] == last) pos = i; selected[i] = false; } if (pos >= 0) selected[pos] = true; setLabelList(arguments_w, arguments.values(), selected, arguments.size(), false, false); if (pos >= 0) XmListSelectPos(arguments_w, pos + 1, False); delete[] selected; Widget text_w = XmSelectionBoxGetChild(dialog, XmDIALOG_TEXT); XmTextSetString(text_w, XMST(last.chars())); updated = true; }
static void update_classes(Widget classes) { StatusDelay delay("Getting list of classes"); StringArray classes_list; get_java_classes(classes_list); // Now set the selection. bool *selected = new bool[classes_list.size()]; for (int i = 0; i < classes_list.size(); i++) selected[i] = false; setLabelList(classes, classes_list.values(), selected, classes_list.size(), false, false); delete[] selected; }
// Create list of processes static void update_processes(Widget processes, bool keep_selection) { StatusDelay delay("Getting list of processes"); string cmd = sh_command(app_data.ps_command) + " 2>&1"; FILE *fp = popen(cmd.chars(), "r"); if (fp == 0) { delay.outcome = strerror(errno); return; } StringArray all_process_list; int c; string line = ""; bool first_line = true; while ((c = getc(fp)) != EOF) { if (c == '\n') { if (first_line || valid_ps_line(line, app_data.ps_command)) all_process_list += line; #if 0 else std::clog << "Excluded: " << line << "\n"; #endif if (first_line) { // Find first occurrence of `PID' title ps_pid_index = line.index(" PID "); if (ps_pid_index < 0) ps_pid_index = 0; } line = ""; first_line = false; } else { line += c; } } pclose(fp); sortProcesses(all_process_list); DynIntArray pids(all_process_list.size()); // If GDB cannot send a signal to the process, we cannot debug it. // Try a `kill -0' (via GDB, as it may be setuid) and filter out // all processes in the `kill' diagnostic -- that is, all // processes that `kill' could not send a signal. string kill = "kill -0"; if (gdb->has_handler_command()) kill = "/usr/bin/kill -0"; // Bypass built-in SUN DBX command int i; for (i = 0; i < all_process_list.size(); i++) { pids[i] = ps_pid(all_process_list[i]); if (pids[i]) kill += string(" ") + itostring(pids[i]); } #if defined(__sun) // bypass underlying debugger // Fix for Sun: use /usr/bin/kill string kill_result; { std::ostringstream os; kill += " 2>&1"; FILE *fp = popen(kill.chars(), "r"); if (fp != 0) { int c; while ((c = getc(fp)) != EOF) { os << (char)c; } pclose(fp); } kill_result = os; } #else string kill_result = gdb_question(gdb->shell_command(kill)); #endif i = 0; while (i >= 0) { i = kill_result.index(rxint, i); if (i >= 0) { int bad_pid = atoi(kill_result.chars() + i); for (int k = 0; k < all_process_list.size(); k++) { if (pids[k] != 0 && pids[k] == bad_pid) { #if 0 std::clog << "Excluded: " << all_process_list[k] << "\n"; #endif all_process_list[k] = NO_GDB_ANSWER; } } i++; } } StringArray process_list; for (i = 0; i < all_process_list.size(); i++) if (all_process_list[i] != NO_GDB_ANSWER) process_list += all_process_list[i]; // Now set the selection. bool *selected = new bool[process_list.size()]; for (i = 0; i < process_list.size(); i++) selected[i] = false; int pos = -1; if (keep_selection) { // Preserve old selection: each PID selected before will also be // selected after. IntArray selection; getPIDs(processes, selection); for (i = 0; i < selection.size(); i++) { for (int j = 0; j < process_list.size(); j++) if (selection[i] == ps_pid(process_list[j])) { if (pos < 0) pos = j; selected[j] = true; } } } if (pos < 0) { // Create new selection from current file and current pid. ProgramInfo info; // Check for current pid; if found, highlight it. for (i = 0; pos < 0 && i < process_list.size(); i++) { if (info.pid != 0 && ps_pid(process_list[i]) == info.pid) pos = i; } if (pos < 0) { // Not found? Try leftmost occurrence of process base name. string current_base = basename(info.file.chars()); int leftmost = INT_MAX; for (i = 0; i < process_list.size(); i++) { int occurrence = process_list[i].index(current_base); if (occurrence >= 0 && occurrence < leftmost && ps_pid(process_list[i]) > 0) { leftmost = occurrence; pos = i; } } } } if (pos >= 0) selected[pos] = true; setLabelList(processes, process_list.values(), selected, process_list.size(), true, false); if (pos >= 0) ListSetAndSelectPos(processes, pos + 1); delete[] selected; }
// Answer GDB question static void select_from_gdb(const string& question, string& reply) { int count = question.freq('\n') + 1; string *choices = new string[count]; bool *selected = new bool[count]; split(question, choices, count, '\n'); // Highlight choice #1 by default for (int i = 0; i < count; i++) { if (!has_nr(choices[i])) { // Choice has no number (prompt) - remove it for (int j = i; j < count - 1; j++) choices[j] = choices[j + 1]; count--; i--; } else { selected[i] = (get_positive_nr(choices[i]) == 1); } } if (count < 2) { // Nothing to choose from if (count == 1) { // Take the first choice. reply = itostring(atoi(choices[0].chars())) + "\n"; } delete[] choices; delete[] selected; return; } // Popup selection dialog static string selection_reply; if (gdb_selection_dialog == 0) { Arg args[10]; Cardinal arg = 0; XtSetArg(args[arg], XmNautoUnmanage, False); arg++; gdb_selection_dialog = verify(XmCreateSelectionDialog(find_shell(gdb_w), XMST("gdb_selection_dialog"), args, arg)); Delay::register_shell(gdb_selection_dialog); XtUnmanageChild(XmSelectionBoxGetChild(gdb_selection_dialog, XmDIALOG_TEXT)); XtUnmanageChild(XmSelectionBoxGetChild(gdb_selection_dialog, XmDIALOG_SELECTION_LABEL)); XtUnmanageChild(XmSelectionBoxGetChild(gdb_selection_dialog, XmDIALOG_APPLY_BUTTON)); gdb_selection_list_w = XmSelectionBoxGetChild(gdb_selection_dialog, XmDIALOG_LIST); XtVaSetValues(gdb_selection_list_w, XmNselectionPolicy, XmSINGLE_SELECT, XtPointer(0)); XtAddCallback(gdb_selection_dialog, XmNokCallback, SelectCB, &selection_reply); XtAddCallback(gdb_selection_dialog, XmNcancelCallback, CancelCB, &selection_reply); XtAddCallback(gdb_selection_dialog, XmNhelpCallback, ImmediateHelpCB, 0); } setLabelList(gdb_selection_list_w, choices, selected, count, false, false); delete[] choices; delete[] selected; manage_and_raise(gdb_selection_dialog); selection_reply = ""; while (selection_reply.empty() && gdb->running() && !gdb->isReadyWithPrompt()) XtAppProcessEvent(XtWidgetToApplicationContext(gdb_w), XtIMAll); // Found a reply - return reply = selection_reply; }
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); }