/* * Set breakpoints condition. * arguments: * file - breakpoints filename * line - breakpoints line * condition - breakpoints line */ void breaks_set_condition(const char* file, int line, const char* condition) { /* do not process async break manipulation on modules that do not support async interuppt */ enum dbs state = debug_get_state(); if (DBS_RUNNING == state && !debug_supports_async_breaks()) return; /* lookup for breakpoint */ breakpoint* bp = NULL; if (!(bp = breaks_lookup_breakpoint(file, line))) return; /* change condition */ strcpy(bp->condition, condition); /* handle setting condition instantly if debugger is idle or stopped and request debug module interruption overwise */ if (state == DBS_IDLE) { on_set_condition(bp); config_set_debug_changed(); } else if (state == DBS_STOPPED) breaks_set_condition_debug(bp); else if (state != DBS_STOP_REQUESTED) debug_request_interrupt((bs_callback)breaks_set_condition_debug, (gpointer)bp); }
/* * Switch breakpoints state. * arguments: * file - breakpoints filename * line - breakpoints line */ void breaks_switch(const char* file, int line) { /* do not process async break manipulation on modules that do not support async interuppt */ enum dbs state = debug_get_state(); if (DBS_RUNNING == state && !debug_supports_async_breaks()) return; /* lookup for breakpoint */ breakpoint* bp = NULL; if (!(bp = breaks_lookup_breakpoint(file, line))) return; /* change activeness */ bp->enabled = !bp->enabled; /* handle switching instantly if debugger is idle or stopped and request debug module interruption overwise */ if (DBS_IDLE == state) { on_switch(bp); config_set_debug_changed(); } else if (DBS_STOPPED == state) breaks_switch_debug(bp); else if (DBS_STOP_REQUESTED != state) debug_request_interrupt((bs_callback)breaks_switch_debug, (gpointer)bp); }
/* * key pressed event */ static gboolean on_key_pressed(GtkWidget *widget, GdkEvent *event, gpointer user_data) { guint keyval = ((GdkEventKey*)event)->keyval; GtkTreeSelection *selection; GList *rows; /* do not process event is page is readonly (debug is running) */ if (readonly) return FALSE; /* get selected rows */ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); rows = gtk_tree_selection_get_selected_rows(selection, &model); rows = g_list_sort(rows, (GCompareFunc)gtk_tree_path_compare); if (keyval == GDK_Delete && rows && g_list_length(rows)) { GList *breaks, *iter; GtkTreeRowReference *new_selection = NULL; GtkTreePath *first_path = (GtkTreePath*)rows->data; /* "delete selected rows" */ /* get new selection */ if (gtk_tree_path_get_depth(first_path) > 1) { new_selection = get_unselected_sibling(first_path); } if (!new_selection) { GtkTreePath *file_path = gtk_tree_path_copy(first_path); if (gtk_tree_path_get_depth(file_path) > 1) { gtk_tree_path_up(file_path); } new_selection = get_unselected_sibling(file_path); gtk_tree_path_free(file_path); } /* collect GList of breakpoints to remove if file row is met - add all unselected breaks to the list as well */ breaks = NULL; for (iter = rows; iter; iter = iter->next) { GtkTreePath *path = (GtkTreePath*)iter->data; GtkTreeIter titer; gtk_tree_model_get_iter(model, &titer, path); if (1 == gtk_tree_path_get_depth(path)) { GtkTreeIter citer; gtk_tree_model_iter_children(model, &citer, &titer); do { if (!gtk_tree_selection_iter_is_selected(selection, &citer)) { gchar *file = NULL; gint line; breakpoint *bp; gtk_tree_model_get(model, &titer, FILEPATH, &file, -1); gtk_tree_model_get(model, &citer, LINE, &line, -1); bp = breaks_lookup_breakpoint(file, line); breaks = g_list_append(breaks, bp); g_free(file); } } while(gtk_tree_model_iter_next(model, &citer)); } else { GtkTreeIter piter; gchar *file = NULL; gint line; breakpoint *bp; gtk_tree_model_iter_parent(model, &piter, &titer); gtk_tree_model_get(model, &piter, FILEPATH, &file, -1); gtk_tree_model_get(model, &titer, LINE, &line, -1); bp = breaks_lookup_breakpoint(file, line); breaks = g_list_append(breaks, bp); g_free(file); } } if (1 == g_list_length(breaks)) { breakpoint *bp = (breakpoint*)breaks->data; g_list_free(breaks); breaks_remove(bp->file, bp->line); } else { breaks_remove_list(breaks); } if (new_selection) { /* get path to select */ GtkTreePath *path = NULL; path = gtk_tree_row_reference_get_path(new_selection); gtk_tree_selection_select_path(selection, path); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(widget), path, NULL, TRUE, 0.5, 0.5); gtk_tree_path_free(path); gtk_tree_row_reference_free(new_selection); } } /* free rows list */ g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL); g_list_free (rows); return FALSE; }