/* * Occures on notify from editor. * Handles margin click to set/remove breakpoint */ gboolean on_editor_notify( GObject *object, GeanyEditor *editor, SCNotification *nt, gpointer data) { if (!editor->document->real_path) { /* no other way to handle removing a file from outside of geany */ markers_remove_all(editor->document); } switch (nt->nmhdr.code) { case SCN_MARGINCLICK: { char* file; int line; break_state bs; if (!editor->document->real_path || 1 != nt->margin) break; file = editor->document->file_name; line = sci_get_line_from_position(editor->sci, nt->position) + 1; bs = breaks_get_state(file, line); if (BS_NOT_SET == bs) breaks_add(file, line, NULL, TRUE, 0); else if (BS_ENABLED == bs) breaks_remove(file, line); else if (BS_DISABLED == bs) breaks_switch(file, line); scintilla_send_message(editor->sci, SCI_SETFOCUS, TRUE, 0); return TRUE; } case SCN_DWELLSTART: { GString *word; if (DBS_STOPPED != debug_get_state ()) break; /* get a word under the cursor */ word = get_word_at_position(editor->sci, nt->position); if (word->len) { gchar *calltip = debug_get_calltip_for_expression(word->str); if (calltip) { leave_signal = g_signal_connect(G_OBJECT(editor->sci), "leave-notify-event", G_CALLBACK(on_mouse_leave), NULL); scintilla_send_message (editor->sci, SCI_CALLTIPSHOW, nt->position, (long)calltip); } } g_string_free(word, TRUE); break; } case SCN_DWELLEND: { if (DBS_STOPPED != debug_get_state ()) break; if (scintilla_send_message (editor->sci, SCI_CALLTIPACTIVE, 0, 0)) { g_signal_handler_disconnect(G_OBJECT(editor->sci), leave_signal); scintilla_send_message (editor->sci, SCI_CALLTIPCANCEL, 0, 0); } break; } case SCN_MODIFYATTEMPTRO: { dialogs_show_msgbox(GTK_MESSAGE_INFO, _("To edit source files stop debugging session")); break; } case SCN_MODIFIED: { if(((SC_MOD_INSERTTEXT & nt->modificationType) || (SC_MOD_DELETETEXT && nt->modificationType)) && editor->document->file_name && nt->linesAdded) { int line = sci_get_line_from_position(editor->sci, nt->position) + 1; GList *breaks = breaks_get_for_document(editor->document->file_name); if (breaks) { GList *iter = breaks; while (iter) { breakpoint *bp = (breakpoint*)iter->data; if (nt->linesAdded > 0 && bp->line >= line) { breaks_move_to_line(bp->file, bp->line, bp->line + nt->linesAdded); bptree_update_breakpoint(bp); } else if (nt->linesAdded < 0 && bp->line >= line) { if (bp->line < line - nt->linesAdded) { breaks_remove(bp->file, bp->line); } else { breaks_move_to_line(bp->file, bp->line, bp->line + nt->linesAdded); bptree_update_breakpoint(bp); } } iter = iter->next; } config_set_debug_changed(); g_list_free(breaks); } } break; } } return FALSE; }
/* * Occures when key is pressed. * Handles debug Run/Stop/... and add/remove breakpoint activities */ gboolean keys_callback(guint key_id) { switch (key_id) { case KEY_RUN: debug_run(); break; case KEY_STOP: debug_stop(); break; case KEY_RESTART: debug_restart(); break; case KEY_STEP_OVER: debug_step_over(); break; case KEY_STEP_INTO: debug_step_into(); break; case KEY_STEP_OUT: debug_step_out(); break; case KEY_EXECUTE_UNTIL: { GeanyDocument *doc = document_get_current(); if (doc) { int line = sci_get_current_line(doc->editor->sci) + 1; debug_execute_until(DOC_FILENAME(doc), line); } break; } case KEY_BREAKPOINT: { GeanyDocument *doc = document_get_current(); if (doc) { int line = sci_get_current_line(doc->editor->sci) + 1; break_state bs = breaks_get_state(DOC_FILENAME(doc), line); if (BS_NOT_SET == bs) breaks_add(DOC_FILENAME(doc), line, NULL, TRUE, 0); else if (BS_ENABLED == bs) breaks_remove(DOC_FILENAME(doc), line); else if (BS_DISABLED == bs) breaks_switch(DOC_FILENAME(doc), line); scintilla_send_message(doc->editor->sci, SCI_SETFOCUS, TRUE, 0); } break; } case KEY_CURRENT_INSTRUCTION: { if (DBS_STOPPED == debug_get_state() && debug_current_instruction_have_sources()) { debug_jump_to_current_instruction(); gtk_widget_set_sensitive(tab_call_stack, FALSE); stree_select_first_frame(FALSE); gtk_widget_set_sensitive(tab_call_stack, TRUE); } } } return TRUE; }
/* * load config file */ void on_load_config(GtkButton *button, gpointer user_data) { FILE *config = fopen(current_path, "r"); if (!config) dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Error reading config file")); /* target */ gchar target[FILENAME_MAX]; readline(config, target, FILENAME_MAX - 1); gtk_entry_set_text(GTK_ENTRY(targetname), target); /* debugger */ gchar debugger[FILENAME_MAX]; readline(config, debugger, FILENAME_MAX - 1); int index = debug_get_module_index(debugger); if (-1 == index) { dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Configuration error: debugger module \'%s\' is not found"), debugger); gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_debugger), 0); } else gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_debugger), index); /* arguments */ gchar arguments[FILENAME_MAX]; readline(config, arguments, FILENAME_MAX - 1); GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); gtk_text_buffer_set_text(buffer, arguments, -1); /* breakpoints and environment variables */ breaks_iterate(removebreak); wtree_remove_all(); gboolean wrongbreaks = FALSE; gchar line[MAXLINE]; gtk_list_store_clear(store); while (readline(config, line, MAXLINE)) { if (!strcmp(line, BREAKPOINTS_MARKER)) { /* file */ gchar file[FILENAME_MAX]; readline(config, file, MAXLINE); /* line */ int nline; readline(config, line, MAXLINE); sscanf(line, "%d", &nline); /* hitscount */ int hitscount; readline(config, line, MAXLINE); sscanf(line, "%d", &hitscount); /* condition */ gchar condition[MAXLINE]; readline(config, condition, MAXLINE); /* enabled */ gboolean enabled; readline(config, line, MAXLINE); sscanf(line, "%d", &enabled); /* check whether file is available */ struct stat st; if(!stat(file, &st)) breaks_add(file, nline, condition, enabled, hitscount); else wrongbreaks = TRUE; } else if (!strcmp(line, ENVIRONMENT_MARKER)) { gchar name[MAXLINE], value[1000]; readline(config, name, MAXLINE); readline(config, value, MAXLINE); GtkTreeIter iter; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, NAME, name, VALUE, value, -1); } else if (!strcmp(line, WATCH_MARKER)) { gchar watch[MAXLINE]; readline(config, watch, MAXLINE); wtree_add_watch(watch); } else { dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Error reading config file")); break; } } if (wrongbreaks) dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Some breakpoints can't be set as the files are missed")); add_empty_row(); fclose(config); if (user_data) dialogs_show_msgbox(GTK_MESSAGE_INFO, _("Config loaded successfully")); }